ADO.NET EF和LINQ打印记录&转换为SQL

时间:2009-09-25 12:58:01

标签: linq entity-framework

我看到了这样的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?另一个是做什么的?

2 个答案:

答案 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,因此您实际上并没有撤回所有记录。