当前位置: 首页 > 编程语言 > C#

C#学习教程:.Skip(),实体框架上的Take()导航属性正在我的SQLServer上执行SELECT-share

时间:2023-04-10 20:20:03 C#

.Skip()。实体框架上的Take()导航属性正在我的SQLServer上执行SELECT*我在生成的部分类上有一个方法,如下所示:varpChildren=this.Children.Skip(skipRelated).Take(takeRelated)。列表();当我查看我的SQLServer时,我可以看到生成的代码正在执行SELECT*.*FROMChildren此代码直接来自我的班级,我已验证我的Skip/Take顺序在我的.ToList之前。如果我删除.ToList,该行很快(并且没有SQL发送到我的数据库),但是当我尝试对结果执行foreach时,我得到相同的SQL发送到我的数据库:SELECT*.*FROMChildren.使用.Skip和.我需要对实体的导航属性做些什么特别的事情吗?更新我会尝试获取实际生成的SQL,我目前还没有为此设置。我找到第一个是因为它出现在SSMS的“最近的昂贵查询”列表中。运行这个:varpChildren=this.Children//.Skip(skipRelated)//.Take(takeRelated).ToList();返回约4,000,000行并花费约25秒。运行这个:varpChildren=this.Children//.Skip(skipRelated).Take(takeRelated).ToList();返回约4,000,000行并花费约25秒。正如我所说,我将获取为这些生成的SQL并构建它们。问题在于,当您查询类似的子集合时,您正在执行LINQ到对象查询。EF将加载整个集合并在内存中执行查询。如果您使用的是EF4,则可以像这样查询varpChildren=this.Children.CreateSourceQuery().OrderBy(/**/).Skip(skipRelated).Take(takeRelated);在EF4.1中varpChildren=context.条目(this).Collection(e=>e.Children).Query().OrderBy(/**/).Skip(skipRelated).Take(takeRelated).Load();如果您在Takehelp的结果上调用Skip?即table.Take(takeCount+skipCount).Skip(skipCount).ToList()另外请参考上面的C#学习教程:.Skip()。实体框架上的Take()导航属性正在我的SQLServer上执行SELECT*。分享的所有内容,如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络收集,不代表立场,如涉及侵权,敬请谅解点击右侧联系管理员删除。如需转载请注明出处: