我看到了这样的ADO.NET EF和LINQ pagging结构:
var query = ...your normal query here...
int totalRecordCount = query.Count();
var pagedQuery = query.Skip(PageIndex*PageSize).Take(PageSize);
此代码似乎查询将所有记录设置到本地内存中的所有记录,因此它获取总计数。之后,它使用skip函数将页面记录到变量pagedQuery中。我错了吗? comipile如何将其转换为SQL?另一个是做什么的?
答案 0 :(得分:3)
如果您要查询的对象实现IQueryable<T>
,它将根据您使用的扩展方法构建不同的查询。 (如果你使用Linq-to-Entities,那一定是必须的)
但是,记录SQL并不像使用Linq-to-SQL那样简单。
使用分析器,或尝试将此Extension方法添加到项目中的静态类:
static string ToTraceString<T>(this IQueryable<T> t)
{
ObjectQuery<T> oqt = t as ObjectQuery<T>;
if (oqt != null)
return oqt.ToTraceString();
return "";
}
有了它,您应该能够验证由不同查询创建的SQL。
var query = ...your normal query here...
Console.WriteLine(query.ToTraceString());
var pagedQuery = query.Skip(PageIndex*PageSize).Take(PageSize);
Console.WriteLine(pagedQuery.ToTraceString());
// Should return something along the lines of SELECT ... FROM ... SKIP x LIMIT y
答案 1 :(得分:2)
您可以运行SQL Server Profiler来查看它正在生成的SQL ...
我相信对Count()的调用会执行SELECT COUNT(*)和Skip()。Take()执行SELECT TOP N,因此您实际上并没有撤回所有记录。