《ntityrameworkecipes》中文翻译系列第五章加载实体和导航属性之延缓加载关联实体和在别的查询操作中使用nclude方法chinafucan

你有一个LINQ查询,使用了类似这样的操作 group by,join,和where;你想使用Include()方法预先加载额外的实体。另外你想使用Code-First来管理数据访问。

解决方案

假设你有如图5-22所示的概念模型

图5-22 一个简单的包含Club和Event以及它们之间一对多关联的模型

在Visual Studio中添加一个名为Recipe7的控制台应用,并确保引用了实体框架6的库,NuGet可以很好的完成这个任务。在Reference目录上右键,并选择 Manage NeGet Packages(管理NeGet包),在Online页,定位并安装实体框架6的包。这样操作后,NeGet将下载,安装和配置实体框架6的库到你的项目中。

创建一个名为Club和Event的类,复制代码清单5-41中的属性到这个类中,创建实体Club和Event实体。

代码清单5-14. Club、Event 实体类

接下来,创建一个名为Recipe7Context的类,并将代码清单5-51中的代码添加到其中,并确保其派生到DbContext类。

为了与group by从句组合使用Include()方法,Include()方法必须放在针对父实体的过虑和分组操作之后。如代码清单5-17所示。

代码清单5-17 . 当父实体上应用过虑和分组时,Include()方法的正确位置。

代码清单5-17的输出如下:

原理

我们创建了一个俱乐部(Club)和三个Events(活动)实体对象。在查询中,我们获取New York 的俱乐部中的所有活动。按俱乐部分组,并查找日期中最早的活动。注意,LINQ扩展方法FirstOrDefault(),巧妙地嵌入到了Select投影操作中。然而变量events只是一个表达式,它还没有在数据库中执行任何操作。

接下来,我们凭借Include()方法预先加载关联实体Club对象的信息,我们将第一个LINQ查询变量,events,作为第二个LINQ查询的输入。这是LINQ组合查询的一个示例。将一个复杂的LINQ查询转换成一系列的短小查询。前面的查询变量是后面查询的数据源。

注意,我们使用First()方法只是为获取第一个Event实例,这样将返回一个Event类型,而不是Event对象的集合。实体框架6包含了一个新的名为 IQueryableExtensions的接口,它公布了Include()方法的原型,它能接受一个基于字符串或是强类型的查询路径作为参数。IQueryableExtensions替换了EF4和EF5中的DbExtension类。

很多开发人员觉得Include()方法很让人迷惑,在一些情况下,智能感知不能有效地提示(因为表达式类型)。在一些情况下,它会在运行时悄悄地被忽略掉。特别地,除非编译器无法确定其结果类型,否则不会给出警告或提示。很多问题都在运行时才会暴露出来,这会使问题更难解决。这里有一些使用Include()方法的准则:

1、Include()方法是一个在IQueryable<T>上的扩展方法;

2、Include()方法只能应用在最终的查询结果集上,当它被在subquery(子查询)、join(连接)或者嵌套从句中,当生成命令树时,它将被忽略掉。在幕后,实体框架会把你的LINQ to Entites查询转换成一棵命令树,然后数据库提供者(database provider)将其处理并构建成一个用于数据库的SQL查询(译注:这一点很重要,我在上面吃过亏,直到现在才弄明白)

3、Include()方法只能应用 在实体类型的结果集上,如果表达式将结果投影到一个非实体类型的类型上,Include()方法将被忽略。

4、在Include()方法和最外面的操作之间,不能改变结果集的类型。例如,一个group by从句,改变结果集的类型。

5、用于Include()方法的查询路径表达式必须从最外层操作返回的类型中的导航属性开始,查询路径不能从任意点开始。

问题

你有一个实体的实例,你想在一个单独的查询中延缓加载其中两个或多个关联实体。这里尤其重要的是,我们如何使用Load()方法来避免查询相同的对象两次。另外你想使用Code-First来管理数据访问。

解决方案

假设你有如图5-23所示的概念模型.

图5-23 一个包含职员(employee),他的部门(department)和部门所在的公司(company)的模型

在Visual Studio中添加一个名为Recipe8的控制台应用,并确保引用了实体框架6的库,NuGet可以很好的完成这个任务。在Reference目录上右键,并选择 Manage NeGet Packages(管理NeGet包),在Online页,定位并安装实体框架6的包。这样操作后,NeGet将下载,安装和配置实体框架6的库到你的项目中。

接下来我们创建三个实体对象:Company,Departmet和Employee,复制代码清单5-18中的属性到这三个类中。

代码清单5-18. 实体类

接下来,创建一个名为Recipe8Context的类,并将代码清单5-19中的代码添加到其中,并确保其派生到DbContext类。

在图5-23所示的模型中,一个职员(Employee)被关联到一个确切的部门(Department)。每个部门被关联到一个确切公司(Company)。

给定一个Employee的实例,你想加载他的部门以及部门所在的公司。是什么让这个问题变得有点特别呢? 我们已经有了一个Employee的实例,我们想避免再一次到数据库中获取Emplyee对象的副本,这种情况,我们可以使用Include()方法来获取关联实体Company和Department。也许,在真实的情况中,Employee的获取和实例化需要非常高的代价。

我们可以使用Load()方法,两次去加载关联实体,一次加载Department实例,一次去加载Company实例。然而,这会产生两次数据库交互。为了在一个查询中加载关联实体的实例,我们可以使用Include()方法和包含Department,Company查询路径,重新在Emlpoyee实体集上查询。或者组合使用Reference()和Query()方法。代码清单5-21演示了这些方法。

代码清单5-21.将数据插入到模型并使用两种稍有不同的方法加载关联实体

代码清单5-21的输出如下:

原理

在第二个查询中,我们使用上下文对象DbContext公布的Entry()方法访问Employee对象并对其执行操作。然后我们链式调用Reference()方法和DbReferenceEntity类的Query()方法,返回一个从数据库中加载关联对象Deparment的查询。另外,我们链式调用Include()方法来拉取关联对象Company的信息。正如所期望的那样,这个查询获取了Department和Company的数据,它没有去获取Employees的数据,因为这些数据已经存在于上下文对象中了。

THE END
0.tournament大量翻译例句关于"tournament" – 英中词典以及8百万条中文译文例句搜索。jvzq<84ep0rjppzgg0ipo8*G:'>C'K6'G:+BH.FF/'K5'K='CF+F8.>8':=0'N<'DH+CD.J:'CJ&CO4vqwxocvjpv0nuou
1.TOURNAMENT中文(簡體)翻譯:劍橋詞典Thedefendingchampionwillplayher firstmatchof the tournamenttomorrow. Thistennistournament isopento bothamateursandprofessionals. Arecurringkneeinjurymay haveimpairedhischancesofwinningthe tournament. The tournament is astraightknockout. (tournament在劍橋英語-中文(簡體)詞典的翻譯 © Cambridge University Press) jvzquC41fkiukxsct{4dcvgtkfmf0xwi1|nu1.J:'C?&;N*G7'>6'K=1'G>&:K*D3'K9'JF';G3&G?*DE'G3'N='CC+:G6*G9'H1'J6'G;+BD.>61vuvtwfogpz
2.翻译'tournament'–字典中文英文 中文 将“tournament"翻译成中文 比赛, 比賽, 锦标赛是“tournament"到 中文 的最佳翻译。 tournament noun 语法 (historical) During the Middle Ages, a series of battles and other contests designed to prepare knights for war. [..] + 加 英文-中文字典 比赛 noun series of games [..]jvzquC41fg4hnxxdg0ipo8jp1|n0vxztpcsfp}
3.tomorrowisanotherday!这句英语翻译成中文是什么意思?7条回答:【推荐答案】Tomorrowisanotherday!字面意思是:明天是新的一天。但常常用来表示激励人的,明天会更好!(对失望的安慰)明天还来得及jvzquC41ycv/|xq0eqs/ew4cum5ya;<268=867mvon
4.翻译'tournament'–字典塞尔维亚克罗地亚语+添加翻译 英文-塞尔维亚-克罗地亚语字典 Turnir sports competition involving a relatively large number of competitors wikidata 显示算法生成的翻译 添加示例 在上下文、翻译记忆库中将“tournament"翻译成 塞尔维亚-克罗地亚语 变形干 第1页 The decision on who will host the World Cup is usually made six or jvzq<84inqycg7hqo1ko1|m1vq{spjrgpv
5.TOURNAMENT英語tournament的翻譯 中文(繁體) 錦標賽… 查看更多內容 中文(簡體) 锦标赛… 查看更多內容 西班牙語 torneo, torneo [masculine, singular]… 查看更多內容 葡萄牙語 torneio, torneio [masculine]… 查看更多內容 更多語言 需要一個翻譯器嗎? 獲得快速、免費的翻譯! jvzquC41fkiukxsct{4dcvgtkfmf0xwi1|nu1.J:'C?&;N*G7'>6'K=1'G>&:K*D3'K9'JF';G3&G?*D5'H1'N='CC+:G8yqwttbonsv
6.TOURNAMENT中文(简体)翻译:剑桥词典tournament的翻译 中文(繁体) 錦標賽… 查看更多内容 西班牙语 torneo, torneo [masculine, singular]… 查看更多内容 葡萄牙语 torneio, torneio [masculine]… 查看更多内容 更多语言 需要一个翻译器吗? 获得快速、免费的翻译! 翻译器工具 tournament的发音是什么? jvzquC41fkiukxsct{4dcvgtkfmf0xwi1|nt1.J:'CL&:M*G7'>6'K=1'G>&:K*D3'K9'JK'CF3&G?*D3'>:'N='CH+BF6*G9'GF'A5'G6+CF.>51vuvtwfogpz
7.TowardsDataScience博客中文翻译2021(六百八十九)[Event "Rated Bullet tournament https://lichess.org/tournament/yc1WW2Ox"] [Site "https://lichess.org/PpwPOZMq"] [Date "2017.04.01"] [Round "-"] [White "Abbot"] [Black "Costello"] [Result "0-1"] [UTCDate "2017.04.01"] [UTCTime "11:32:01"] [WhiteElo "2100"] [BlackElo "jvzquC41dnuh0lxfp0tfv8|k|cxehxwegn5bt}neng5eg}fknu526<553572
8.TOURNAMENTEnglishmeaningTOURNAMENT definition: 1. a competition for teams or single players in which a series of games is played, and the winners…. Learn more.jvzquC41fkiukxsct{4dcvgtkfmf0xwi1fodvrtpct0gwlnkun0vxztpcsfp}
9.atop是什么意思,atop中文翻译,atop发音、用法及例句atop中文意思翻译 adv.在顶上 prep.在 的顶上 atop常见例句 1、Atop the mountains that, into the heavens gaze.───在顶上山,凝视进天堂。 2、The images of the dead, fixed in immobile stoneatoptheir ancient tombs, did not stay his passing.───他想象中的死人,只是一动不动的石像,座落jvzq<84yyy4tjjszklobpƒmw|k€ik7hqo1}0g?67;:4ivvq
10.2024哈佛Harvard — MIT Mathematics Tournament( 简称:HMMT)美国哈佛—麻省理工大学数学锦标赛,是由哈佛大学和麻省理工学院轮流举办的面向高中学生的数学竞赛,是全美最具有影响的高中数学竞赛之一。活动由Havard和MIT的学生组织运营,他们之中很多都曾是HMMT的参赛者。参赛者则是由全美及世界各地的优秀高中生队伍组成。2024年2月份jvzquC41yy}/5?5fqe4dp8ftvkimg8<445:1;;d333;73<5490nuou
11.Australian是什么意思中文翻译 1 adj. 澳大利亚的,澳大利亚人的 2 n. 澳大利亚人 英语释义 1 n. a native or inhabitant of Australia 2 n. the Austronesian languages spoken by Australian aborigines 3 a. of or relating to or characteristic of Australia or its inhabitants or its languagesjvzquC41fkiu0mn{n~/exr1Cwyutjqkcp4ivvq
12.ElMoro(OUTLANDISH)lyrics中英对照歌词中文翻译English lyrics中文翻译对照歌词(此翻译并不准确,仅供学习参考) [Chorus:][合唱: ] Out to change the game -el Moro出改变游戏 - EL摩洛 Withstand the pain -el Moro承受之痛 - EL摩洛 Knock them out' the frame -el Moro敲出来“的框架 - EL摩洛 jvzquC41yy}/gwlnkunft7sgv1rztrhu1nskl4gn/sptx4
13.Nadal是什么意思,Nadal中文翻译,Nadal怎么读、发音、用法及例句英: 美: Nadal 中文意思翻译 常见释义: n.纳达尔;拿度 Nadal 短语词组 1、nadalroland garros ─── 仍然是罗兰·加洛斯 2、rafaelnadal─── 拉斐尔·纳达尔(西班牙网球选手) Nadal 相似词语短语 1、rafael nadal ─── 拉斐尔·纳达尔(西班牙网球选手) jvzq<84yyy4jv;68:0ipo8f1|k~vp8{539;78;5434819;>40jznn
14.TowardsDataScience博客中文翻译2019(十三)撒打算dfasTowardsDataScience 博客中文翻译 2019(十三) TowardsDataScience Blog 协议:CC BY-NC-SA 4.0 数据科学家的7 条经验教训 原文:https://towardsdatascience.com/7-lessons-learned-for-data-scientists-461d435d68d5?source=collection_archive---27--- Photo byJustin MainonUnsplash 从错误中jvzquC41dnuh0lxfp0tfv8|k|cxehxwegn5bt}neng5eg}fknu526;;686=1
15.YourMove(BLACKALICIOUS)lyrics歌词"Your Move" 的所有者拥有该歌词的产权和版权。仅供教育目的且仅限个人使用。 歌词"Your Move" 的中文对照翻译版本由本站整理完成,仅供学习参考,对于其中的错误本站不承担任何责任。jvzquC41yy}/gwlnkunft7sgv1rztrhu1nskl4{qwx.ox{g/35
16.redd是什么意思,redd中文翻译,redd发音、用法及例句49 、Redd, along with Mike Miller, have been the most consistent perimeter shooters for Team USA, which is expected to face plenty of zone defenses in the FIBA Americas tournament.───里德和米勒是美国队最强的中距离投手,在国际篮联美洲杯赛上美国队将面对很多联防。 50 、Though opportunity costsjvzq<84yyy4tjjszklobpƒmw|k€ik7hqo1}0g>::954ivvq