Data = _db.ALLOCATION_D.OrderBy(a => a.ALLO_ID)
.Skip(10)
.Take(10)
.ToList();
假设我在ALLOCATION_D
表中有100000行。我想选择前10行。现在我想知道上面的语句是如何执行的。我不知道,但我认为它以下列方式执行......
是不是?我想知道更多细节。
答案 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)
您的陈述如下:
如果您希望它选择第一个十行,您只需执行以下操作:
Data = _db.ALLOCATION_D // You don't need to order twice
.OrderBy(a => a.ALLO_ID)
.Take(10)
.ToList()
答案 2 :(得分:0)
直到ToList
调用,调用才会生成表达式。这意味着OrderBy
,Skip
和Take
调用被捆绑为一个表达式,然后发送到实体框架以在数据库中执行。
实体框架将从该表达式生成一个SQL查询,该表达式返回表中的十行,ToList
方法读取这些行,并放置在List<T>
中,其中T
是类型ALLOCATION_D
集合中的项目。