【问题标题】:ADO.NET EF and LINQ pagging records & translation to SQLADO.NET EF 和 LINQ 分页记录和 SQL 转换
【发布时间】:2023-04-07 13:21:01
【问题描述】:

我看到了这样的 ADO.NET EF 和 LINQ 分页结构:

var query = ...your normal query here...
int totalRecordCount = query.Count();
var pagedQuery = query.Skip(PageIndex*PageSize).Take(PageSize);

此代码似乎查询了将它们设置到本地内存中的所有记录,因此它获取了总数。之后,它使用跳过函数将记录分页到变量 pagedQuery 中。我错了吗?编译器如何将其转换为 SQL?另一个是做什么的?

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    如果您查询的对象实现了IQueryable<T>,它将根据您使用的扩展方法构建不同的查询。 (如果您使用的是 Linq-to-Entities,则必须如此)

    但是记录 SQL 并不像使用 Linq-to-SQL 那样简单。

    要么使用分析器,要么尝试将此扩展方法添加到项目中的静态类:

    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
    

    【讨论】:

    • 不错的一个!我使用 nHibernate 做了类似的事情。非常感谢!
    • var countQuery = query.Count() 将返回 int,它不是 IQueryable!
    • 谢谢,这是我的疏忽。
    【解决方案2】:

    您可以运行 SQL Server Profiler 来准确查看它生成的 SQL...

    我相信对 Count() 的调用会执行 SELECT COUNT(*) 而 Skip().Take() 会执行 SELECT TOP N,因此您实际上并没有撤回所有记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2011-01-15
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多