麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

EntityFramework6Recipes2ndEdition(11-6)譯->從一個”模型定義”函數里返回一個復雜類型

2019-11-14 13:30:22
字體:
來源:轉載
供稿:網友

11-6.從一個”模型定義”函數里返回一個復雜類型

問題

想要從一個”模型定義”函數返回一個復雜類型

解決方案

假設我們有一個病人(patient)和他們訪客(visit)的模型,如 Figure 11-6所示 .

 

Figure 11-6. A model for patient visits

我們想要創建一個”模型定義”函數,返回一個概要信息,包括:病人名字,病人的訪客數,和病人累積的賬單. 此外,我們只過濾出年齡超過40歲的病人:

1. 在模型設計視圖上,右擊, 新建 ? 復雜類型.

2.在模型瀏覽器里右擊新建的復雜類型,重命名為VisitSummary, 然后給復雜屬性添加下列屬性::

a. Name: String,不可為null

b. TotalVisits: Int32, 不可為null

c. TotalCost:Decimal, 不可為null

3. 在解決方案資源管理器中右擊.edmx 文件, 打開方式 ? xml 編輯器.

4. 在.edmx 文件的概念模型conceptual models)的<Schema> 標簽下插入Listing 11-11所示的代碼,這樣函數主定義好了.

 Listing 11-11. The GetVisitSummary() Model-Defined Function

 

        <Function Name="GetVisitSummary"  ReturnType="Collection(EFRec

          <DefiningExPRession>

            select VALUE EFRecipesModel.VisitSummary(pv.Patient.Name,

            Count(pv.VisitId),Sum(pv.Cost))

            from EFRecipesEntities.PatientVisits as pv

            group by pv.Patient.Name

          </DefiningExpression>

        </Function>

5. 用如 Listing 11-12.所示的代碼來插入和查詢這個模型:

Listing 11-12. Using eSQL and LINQ with the VisitSummary() Function to Query the Model

    class Program

    {

        static void Main(string[] args)

        {

            RunExample();

        }

        static void RunExample()

        {

            using (var context = new EFRecipesEntities())

            {

                string hospital = "Oakland General";

                var p1 = new Patient { Name = "Robin Rosen", Age = 41 };

                var p2 = new Patient { Name = "Alex Jones", Age = 39 };

                var p3 = new Patient { Name = "Susan Kirby", Age = 54 };

                var v1 = new PatientVisit

                {

                    Cost = 98.38M,

                    Hospital = hospital,

                    Patient = p1

                };

                var v2 = new PatientVisit

                {

                    Cost = 1122.98M,

                    Hospital = hospital,

                    Patient = p1

                };

                var v3 = new PatientVisit

                {

                    Cost = 2292.72M,

                    Hospital = hospital,

                    Patient = p2

                };

                var v4 = new PatientVisit

                {

                    Cost = 1145.73M,

                    Hospital = hospital,

                    Patient = p3

                };

                var v5 = new PatientVisit

                {

                    Cost = 2891.07M,

                    Hospital = hospital,

                    Patient = p3

                };

                context.Patients.Add(p1);

                context.Patients.Add(p2);

                context.Patients.Add(p3);

                context.SaveChanges();

            }

            using (var context = new EFRecipesEntities())

            {

                Console.WriteLine("Query using eSQL...");

                var esql = @"Select value ps from EFRecipesEntities.Patients

                        as p join EFRecipesModel.GetVisitSummary()

                        as ps on p.Name = ps.Name where p.Age > 40";

                var objectContext = (context as IObjectContextAdapter).ObjectContext;

                var patients = objectContext.CreateQuery<VisitSummary>(esql);

                foreach (var patient in patients)

                {

                    Console.WriteLine("{0}, Visits: {1}, Total Bill: {2}",

                    patient.Name, patient.TotalVisits.ToString(),

                    patient.TotalCost.ToString("C"));

                }

            }

 

            using (var context = new EFRecipesEntities())

            {

                Console.WriteLine();

                Console.WriteLine("Query using LINQ...");

                //譯注:遇到了與11-5一樣的異常

                var patients = from p in context.Patients

                               join ps in context.GetVisitSummary() on p.Name equals

                               ps.Name

                               where p.Age >= 40

                               select ps;

                foreach (var patient in patients)

                {

                    Console.WriteLine("{0}, Visits: {1}, Total Bill: {2}",

                    patient.Name, patient.TotalVisits.ToString(),

                    patient.TotalCost.ToString("C"));

                }

            }

        }

    }

    partial class EFRecipesEntities

    {

        [EdmFunction("EFRecipesModel", "GetVisitSummary")]

        public IQueryable<VisitSummary> GetVisitSummary()

        {

            var objectContext = (this as IObjectContextAdapter).ObjectContext;

            return objectContext.CreateQuery<VisitSummary>(

                Expression.Call(Expression.Constant(this),

                  (MethodInfo)MethodInfo.GetCurrentMethod()).ToString());

        }

}

Listing 11-12代碼輸出結果如下:

Query using eSQL...

Robin Rosen, Visits: 2, Total Bill: $1,221.36

Susan Kirby, Visits: 2, Total Bill: $4,036.80

Query using LINQ...

Robin Rosen, Visits: 2, Total Bill: $1,221.36

Susan Kirby, Visits: 2, Total Bill: $4,036.80

它是如何工作的?

我們先在模型里添加一個復雜類型,接著創建如Listing 11-11的GetVisitSummary() 函數,它能返回包含這個新建的復雜類型的集合.注意:復雜類型的構造函數接受參數的順序要與我們定義它的屬性時的順序一致. 你可能需要檢查.edmx文件,確保設計器按我們添加的順序是一致.

由于我們函數返回IQueryable<VisitSummary>, 所以我們需要實現引導代碼. 同樣,因為我們需要訪問ObjectContext的QueryProvider,所以我們需要在EFRecipesEntities類中實現運行時方法.

如果我們把這個函數用在LINQ查詢中,你可能需要讓這個方法返回IQueryable<DbDataRecord>給匿名類型.雖然我們的這個集合不能進一步過濾,但是包含復雜類型的集合是可以被進一點過濾的.

 

附:創建示例用到的數據庫的腳本文件

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久久久亚洲a | 欧美女孩videos | 日韩中文一区 | 精品成人av一区二区在线播放 | 男人午夜小视频 | 国产精品免费久久久久 | 欧美成年性h版影视中文字幕 | 特片网久久 | 国产精品久久久久久久久久东京 | 亚洲福利视 | 免费欧美| 伊人网站| 国产精品欧美久久久久一区二区 | 国产精品片一区二区三区 | 国产精品欧美久久久久一区二区 | 久久免费视频一区二区三区 | 国产精品久久久久久久久久了 | 欧美精品久久久久久久久久 | 久久精品a一级国产免视看成人 | 伊人亚洲精品 | 中文字幕免费在线观看视频 | av在线一区二区三区四区 | 久久精品亚洲欧美日韩精品中文字幕 | 国产亚洲美女精品久久久2020 | 欧美日韩一区三区 | av免费av | 精品欧美一区二区精品久久 | 男女牲高爱潮免费视频男女 | 欧美一级黄色免费看 | 国产papa| 热re91久久精品国产99热 | 国产大片免费看 | 99精品无人区乱码在线观看 | 成人三级电影网址 | 姑娘第四集免费看视频 | 成人精品一区二区三区中文字幕 | 久久久tv | 精品免费在线视频 | 日本欧美中文字幕 | 成人在线视频在线观看 | 久久久久久久久久久一区 |