亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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>給匿名類型.雖然我們的這個集合不能進一步過濾,但是包含復雜類型的集合是可以被進一點過濾的.

 

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

 

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国产自产拍高清av水多| 欧美猛交ⅹxxx乱大交视频| 国产精品精品一区二区三区午夜版| 色与欲影视天天看综合网| 欧美性猛交xxxxx水多| 亚洲欧美精品中文字幕在线| 2023亚洲男人天堂| 福利精品视频在线| 国产亚洲精品高潮| 国产亚洲欧洲高清| 欧美在线视频一区二区| 久久久久五月天| 亚洲国产成人爱av在线播放| 欧美成在线视频| 亚洲夜晚福利在线观看| 国产精品精品久久久久久| 欧美性理论片在线观看片免费| 亚洲电影免费观看高清| 国产成人激情小视频| 国产精品免费福利| 91精品综合久久久久久五月天| 亚洲伦理中文字幕| 国产精品入口日韩视频大尺度| xxxx欧美18另类的高清| 九色精品美女在线| 欧美午夜女人视频在线| 欧美影院在线播放| 97视频在线观看播放| 4438全国亚洲精品在线观看视频| 亚洲成人精品在线| 亚洲一区中文字幕在线观看| 国产福利精品视频| 亚洲午夜精品久久久久久久久久久久| 日韩激情视频在线| 国产在线精品播放| 欧美在线视频观看| 久久视频在线看| 97在线免费观看视频| 中文字幕亚洲无线码在线一区| 日韩中文字幕在线观看| 久久在线免费视频| 国产精品揄拍一区二区| 欧美日韩激情视频| 成人黄色大片在线免费观看| 欧美性猛交xxxx| 在线精品国产成人综合| 91香蕉亚洲精品| 美日韩丰满少妇在线观看| 粉嫩老牛aⅴ一区二区三区| 米奇精品一区二区三区在线观看| 久久夜色精品国产| 亚洲欧美日韩一区二区三区在线| 国产色综合天天综合网| 国产精品三级美女白浆呻吟| 久久国产精品免费视频| 国产精品一区二区电影| 欧美肥臀大乳一区二区免费视频| 性欧美长视频免费观看不卡| 国产欧美韩国高清| 亚洲成年人在线| 日本视频久久久| 2021国产精品视频| 97在线精品视频| 欧美视频中文字幕在线| 欧美激情videoshd| 日韩一区在线视频| 中文字幕一区二区精品| 日韩在线一区二区三区免费视频| 中国人与牲禽动交精品| 欧美一区二区三区精品电影| 国产精自产拍久久久久久| 在线观看不卡av| 日韩av网站在线| 中文字幕亚洲综合| 欧美色视频日本版| 亚洲影院在线看| 亚洲精品一区中文字幕乱码| 亚洲国产天堂久久综合网| 日韩欧美精品在线观看| 不卡毛片在线看| 亚洲天堂日韩电影| 精品动漫一区二区三区| 91在线观看欧美日韩| 国产综合色香蕉精品| 久久成人人人人精品欧| 国产69精品久久久久久| 97超级碰碰碰久久久| 日韩亚洲第一页| 日韩日本欧美亚洲| 久久久久久久久久久国产| 国产自产女人91一区在线观看| 色婷婷av一区二区三区在线观看| 成人免费观看a| 精品国内自产拍在线观看| 国产大片精品免费永久看nba| 亚洲a在线观看| 精品国内产的精品视频在线观看| 国产精品视频色| 国产免费一区二区三区在线能观看| 久久国产精品久久久久| 日韩av黄色在线观看| 日韩亚洲第一页| 欧美夜福利tv在线| 国产精品夫妻激情| 国产成人在线播放| 91在线播放国产| xxxxx91麻豆| 日韩精品在线播放| 亚洲无线码在线一区观看| 欧美第一黄网免费网站| 精品国产欧美一区二区三区成人| 国产色婷婷国产综合在线理论片a| 中文字幕一精品亚洲无线一区| 欧美成人手机在线| 中文字幕国产精品| 在线观看国产精品日韩av| 国产一区二区三区免费视频| 国产精品成人一区二区| 久久精品国产精品亚洲| 最近2019好看的中文字幕免费| 国产ts一区二区| 欧美美女15p| 一本一道久久a久久精品逆3p| 91久久精品国产| 欧美在线精品免播放器视频| 久久久久亚洲精品成人网小说| 成人国产精品久久久久久亚洲| 日本伊人精品一区二区三区介绍| 日韩av手机在线观看| 欧美激情一级欧美精品| 精品国产鲁一鲁一区二区张丽| 色视频www在线播放国产成人| 亚洲欧洲国产伦综合| 久久国产精品免费视频| 亚洲国产一区二区三区在线观看| 久久理论片午夜琪琪电影网| 欧美日韩国产999| 久久99国产综合精品女同| 日韩精品免费观看| 日韩成人小视频| 久久免费视频在线观看| 欧美午夜精品久久久久久浪潮| 欧美视频一二三| 欧美极品欧美精品欧美视频| 国产精品黄页免费高清在线观看| 欧美日韩激情网| 一区二区三区四区在线观看视频| 美乳少妇欧美精品| 亚洲加勒比久久88色综合| 国产精品一二三视频| 亚洲乱码一区av黑人高潮| 亚洲国产成人久久综合| 国产一区二区美女视频| 亚洲欧美中文日韩在线v日本| 中文字幕精品久久| 日韩成人激情在线| 日韩欧美国产视频| 亚洲视频一区二区| 亚洲夜晚福利在线观看| 91精品国产综合久久香蕉最新版| 中文字幕亚洲精品| 日韩在线观看免费高清完整版| 亚洲毛片在线免费观看| 91精品在线国产|