Nat*_*ate 8 .net c# entity-framework navigation-properties sql-server-2008-r2
我在生成的部分类上有一个方法,如下所示:
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Run Code Online (Sandbox Code Playgroud)
当我查看我的SQL Server时,我可以看到生成的代码正在执行SELECT *.* FROM Children此代码是直接从我的类中获取的,我已经验证了我的Skip/Take的顺序是在我的.ToList之前.
如果我删除.ToList,那行很快(并且没有SQL发送到我的数据库),但是当我尝试foreach结果时,我得到了发送到我的数据库的相同SQL : SELECT *.* FROM Children.
使用.Skip和.在我的实体的导航属性上有什么特别的东西需要做吗?
更新
我将尝试获取实际生成的SQL,我目前尚未设置.我找到了第一个,因为它出现在SSMS的"最近的昂贵查询"列表中.
运行这个:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
Run Code Online (Sandbox Code Playgroud)
返回〜4,000,000行,需要约25秒.
运行这个:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Run Code Online (Sandbox Code Playgroud)
返回〜4,000,000行,需要约25秒.
正如我所说,我将抓住为这些生成的SQL并将它们构建起来.
问题是,当您查询这样的子集合时,您正在执行LINQ到对象查询.EF将加载整个集合并在内存中执行查询.
如果您使用的是EF 4,可以像这样查询
var pChildren = this.Children.CreateSourceQuery()
.OrderBy(/* */).Skip(skipRelated).Take(takeRelated);
Run Code Online (Sandbox Code Playgroud)
在EF 4.1中
var pChildren = context.Entry(this)
.Collection(e => e.Children)
.Query()
.OrderBy(/* */).Skip(skipRelated).Take(takeRelated)
.Load();
Run Code Online (Sandbox Code Playgroud)