这个linq如何执行?

时间:2013-04-17 08:04:58

标签: linq entity-framework c#-4.0 linq-to-entities

Data = _db.ALLOCATION_D.OrderBy(a => a.ALLO_ID)
                       .Skip(10)
                       .Take(10)
                       .ToList();

假设我在ALLOCATION_D表中有100000行。我想选择前10行。现在我想知道上面的语句是如何执行的。我不知道,但我认为它以下列方式执行......

  1. 首先选择100000行
  2. 然后由ALLO_ID
  3. 订购
  4. 然后跳过10
  5. 最后选择10行。
  6. 是不是?我想知道更多细节。

3 个答案:

答案 0 :(得分:2)

此Linq通过Entity Framework生成SQL查询。然后它取决于您的DBMS,但对于SQL Server 2008,这里的查询产生:

SELECT TOP (10) [Extent1].[ALLO_ID] AS [ALLO_ID],   
FROM ( 
    SELECT [Extent1].[ALLO_ID] AS [ALLO_ID]
         , row_number() OVER (ORDER BY [Extent1].[ALLO_ID] ASC) AS [row_number]
    FROM [dbo].[ALLOCATION_D] AS [Extent1]
)  AS [Extent1]
WHERE [Extent1].[row_number] > 10
ORDER BY [Extent1].[ALLO_ID] ASC

您可以在C#中运行此命令以检索查询:

var linqQuery = _db.ALLOCATION_D
                   .OrderBy(a => a.ALLO_ID)
                   .Skip(10)
                   .Take(10);
var sqlQuery = ((System.Data.Objects.ObjectQuery)linqQuery).ToTraceString();
Data = linqQuery.ToList();

Linq To SQL的第二个选项

var linqQuery = _db.ALLOCATION_D
                   .OrderBy(a => a.ALLO_ID)
                   .Skip(10)
                   .Take(10);
var sqlQuery = _db.GetCommand(linqQuery).CommandText;
Data = linqQuery.ToList();

参考文献:

答案 1 :(得分:0)

您的陈述如下:

  1. 选择所有行(由skip / take覆盖)
  2. 按Allo_ID排序
  3. 再次通过Allo_ID订购
  4. 跳过前10行
  5. 接下来的10行
  6. 如果您希望它选择第一个十行,您只需执行以下操作:

     Data = _db.ALLOCATION_D // You don't need to order twice
                        .OrderBy(a => a.ALLO_ID)
                        .Take(10)
                        .ToList()
    

答案 2 :(得分:0)

直到ToList调用,调用才会生成表达式。这意味着OrderBySkipTake调用被捆绑为一个表达式,然后发送到实体框架以在数据库中执行。

实体框架将从该表达式生成一个SQL查询,该表达式返回表中的十行,ToList方法读取这些行,并放置在List<T>中,其中T是类型ALLOCATION_D集合中的项目。