使用skip和take实体框架时会形成哪个sql查询?

时间:2016-08-11 09:49:19

标签: sql-server entity-framework linq

我使用以下查询从SQL Server使用Entity Framework获取结果:

/// <summary>
/// Get product list 
/// </summary>
/// <returns></returns>
public List<Products> GetProductList(int pageIndex, int pageSize)
{
    return (from p in ctx.Products
            select p).Skip(pageIndex * pageSize).Take(pageSize).ToList();
}

内部如何运作?我的意思是哪个查询将在数据库中执行?

默认情况下是否使用延迟加载?

1 个答案:

答案 0 :(得分:2)

简短回答:您发布的代码只会抛出异常:

  

方法'Skip'仅支持LINQ to Entities中的排序输入。必须在方法'Skip'

之前调用'OrderBy'方法

更长的答案:假设您在代码中加入了OrderBy,并且您的实体框架正在定位最新版本的SQL Server(即SQL2012或更新版本),那么您将让SQL看起来像这样:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Column2] AS [Column2], 
    [Extent1].[Column3] AS [Column3], 
    [Extent1].[Column4] AS [Column4], 
        --etc
    FROM [dbo].[Products] AS [Extent1]
    ORDER BY [Extent1].[Id] ASC
    OFFSET 5 ROWS FETCH NEXT 4 ROWS ONLY 

请注意查询的最后一行,它使用OFFSET/FETCH语法跳过5行并接下来的4行。

至于延迟加载问题,此处没有任何内容暗示您已将其禁用,因此默认情况下它将 on