.Skip().实体框架上的Take()导航属性正在我的SQL Server上执行SELECT*

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并将它们构建起来.

Era*_*nga 7

问题是,当您查询这样的子集合时,您正在执行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)