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

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

  1. 首先它选择 100000 行
  2. 然后按 ALLO_ID 排序
  3. 然后跳过 10
  4. 最后选择 10 行。

这样对吗?我想知道更多细节。

4

3 回答 3

2

此 Linq 通过实体框架生成 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();

参考:

于 2013-04-17T08:16:42.217 回答
0

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

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

于 2013-04-17T08:14:18.527 回答
0

你的陈述如下:

  1. 选择所有行(被跳过/采取覆盖)
  2. 按 Allo_ID 排序
  3. 再次按 Allo_ID 订购
  4. 跳过前 10 行
  5. 取接下来的 10 行

如果您希望它选择十行​​,您只需执行以下操作:

 Data = _db.ALLOCATION_D // You don't need to order twice
                    .OrderBy(a => a.ALLO_ID)
                    .Take(10)
                    .ToList()
于 2013-04-17T08:08:00.733 回答