只是好奇如何跳过&采取应该工作。我得到了我希望在客户端看到的结果,但是当我连接AnjLab SQL事件探查器并查看正在执行的SQL时,它看起来好像是查询整行行并将其返回给客户。实体框架/ Linq to SQL:跳过并采取
它真的返回所有的行,然后用客户端上的LINQ排序和缩小的东西?
我试着用Entity Framework和Linq来做到这一点;两者似乎都有相同的行为。
不知道这有什么差别,但我使用C#在2010年VWD
任何见解?
public IEnumerable<Store> ListStores(Func<Store, string> sort, bool desc, int page, int pageSize, out int totalRecords)
{
var context = new TectonicEntities();
totalRecords = context.Stores.Count();
int skipRows = (page - 1) * pageSize;
if (desc)
return context.Stores.OrderByDescending(sort).Skip(skipRows).Take(pageSize).ToList();
return context.Stores.OrderBy(sort).Skip(skipRows).Take(pageSize).ToList();
}
产生的SQL(注:我不包括统计查询):
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[LegalName] AS [LegalName],
[Extent1].[YearEstablished] AS [YearEstablished],
[Extent1].[DiskPath] AS [DiskPath],
[Extent1].[URL] AS [URL],
[Extent1].[SecureURL] AS [SecureURL],
[Extent1].[UseSSL] AS [UseSSL]
FROM [dbo].[tec_Stores] AS [Extent1]
经过进一步的研究,我发现了以下工作我希望它的方式:
public IEnumerable<Store> ListStores(Func<Store, string> sort, bool desc, int page, int pageSize, out int totalRecords)
{
var context = new TectonicEntities();
totalRecords = context.Stores.Count();
int skipRows = (page - 1) * pageSize;
var qry = from s in context.Stores orderby s.Name ascending select s;
return qry.Skip(skipRows).Take(pageSize);
}
产生的SQL:
SELECT TOP (3)
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[LegalName] AS [LegalName],
[Extent1].[YearEstablished] AS [YearEstablished],
[Extent1].[DiskPath] AS [DiskPath],
[Extent1].[URL] AS [URL],
[Extent1].[SecureURL] AS [SecureURL],
[Extent1].[UseSSL] AS [UseSSL]
FROM (SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name], [Extent1].[LegalName] AS [LegalName], [Extent1].[YearEstablished] AS [YearEstablished], [Extent1].[DiskPath] AS [DiskPath], [Extent1].[URL] AS [URL], [Extent1].[SecureURL] AS [SecureURL], [Extent1].[UseSSL] AS [UseSSL], row_number() OVER (ORDER BY [Extent1].[Name] ASC) AS [row_number]
FROM [dbo].[tec_Stores] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 3
ORDER BY [Extent1].[Name] ASC
我真的很喜欢第一个选项的工作方式;传入一个lambda表达式进行排序。有什么办法可以在LINQ to SQL orderby语法中完成同样的事情吗?我尝试使用qry.OrderBy(排序).Skip(skipRows).Take(pageSize),但最终给了我与我的第一个代码块相同的结果。让我相信我的问题与OrderBy有某种联系。
====================================
问题解决了
必须包装在表达传入的lambda函数:
Expression<Func<Store,string>> sort
你可以给我们的那种FUNC代码? – 2010-10-06 15:15:34
当然,我只是传递一个lambda。例如:x => x.Name,x => x.LegalName,x => x.YearEstablished.ToString() – Sam 2010-10-06 15:28:54
开始认为我应该传递一个字符串,然后使用switch语句为LINQ设置适当的orderby参数查询:(第一个方法非常酷,涉及的代码少得多,我不明白为什么它不能正常工作。不知道到底发生了什么,似乎.OrderBy和.OrderByDescending触发数据库提取,然后应用排序,然后跳过并采取。也许这是它虽然...也许OrderBy不知道如何将x => x.Name转换为适当的SQL,因此它提取结果集,然后应用排序和筛选。 – Sam 2010-10-06 15:46:16