【问题标题】:Get Total Count and Page Rows in same database trip when using Entity Framework使用实体框架时获取同一数据库行程中的总计数和页行
【发布时间】:2014-08-04 23:35:28
【问题描述】:

我目前正在使用以下方法来获取客户页面以及总数。唯一的问题是我要进行 2 次数据库访问 - 一次用于获取总计数,另一次用于获取页面的实际行数。

我的问题是:我可以将 totalcount 查询与实际行查询结合起来,以便 Entity Framework 在一次数据库行程中发送这两个查询吗?

public IList GetPageOfCustomers(string name, int skipCount, 
                     int pageSize, out int totalCount) {

using(CustomerEntities e = new CustomerEntities()) {

    //FIRST QUERY
    var query = (from c in e.Customers
    where c.NAME.Contains(name)
    select new {
        c.CustomerID, c.NAME, c.CITY, c.STATE, c.COUNTRY
    })
        .Distinct()
        .OrderBy(s = > s.NAME)
        .ThenBy(s = > s.CITY)
        .ThenBy(s = > s.CustomerID);


    //SECOND QUERY ( executed in a separate database trip)
    int totalCount = (from c in e.Customers
    where c.NAME.Contains(name)
    select new {
        c.CustomerID, c.NAME, c.CITY, c.STATE, c.COUNTRY
    })
        .Distinct()
        .Count();

    return query.Skip(skipCount).Take(pageSize).ToList();
     }//END of  USING
   }//END of  METHOD

【问题讨论】:

  • 我想获取为页面行获取的相同结果集的不同计数,否则我可能会得到不准确的总计数。
  • where m.NAME.Contains(name)m是什么?不应该是c吗?
  • @ATM,感谢您指出这一点。我已将 m 更改为 c。
  • @ATM,你的意思是创建一个存储过程来执行这两个查询?
  • 使用Entity Framework Extended,您可以在一个包中发送多个查询。 (参见“未来查询”)。

标签: c# entity-framework-4


【解决方案1】:

根据数据库往返的成本和返回的项目数量,执行一次基本查询并在 c# 服务器上执行分页/计数操作可能会更快/更容易。即

var results = (from c in e.Customers
               where m.Name.Contains(name)
               select new { c.CustomerId, c.NAME, c.CITY, c.STATE, c.COUNTRY })
              .Distinct()
              .OrderBy(s => s.NAME)
              .ThenBy(s => s.CITY)
              .ThenBy(s => s.CustomerId)
              .ToList();
totalCount = results.Count;
return results.Skip(skipCount).Take(pageSize).ToList();

这只会执行一次数据库调用,而不会在sql server上执行分页操作。

编辑:
也看看这个Better way to query a page of data and get total count in entity framework 4.1?

【讨论】:

  • 这行得通,但我希望在一次数据库行程中执行 2 个查询,否则我最终可能会导致数据库返回大量行,这是我要避免的。
  • 啊,这个怎么样:stackoverflow.com/questions/7767409/…
  • 你能把这个放在你的帖子里,我可以把它标记为答案吗?
  • 当然,很抱歉。我刚刚进入 StackOverflow
  • 解决方案不可扩展。如果需要 1 页,请不要将所有表格加载到服务器
【解决方案2】:

我对这个问题进行了很多思考和研究。目前,对于 EF 6,有 2 个良好做法:

(1) 第一个解决方案是有一个存储过程(我知道,我知道,你通常希望在使用 EF 时避免使用存储过程,然后转到解决方案 2!),它返回多个结果。这篇文章解释了它:

Entity Framework Sprocs with Multiple Result Sets

(2) 第二个最佳实践是使用Entity Framework Plus 包的“Query Future”功能。这是 Entity Framework 的一个非常酷的扩展,可以在一次数据库行程中运行多个查询。

【讨论】:

  • 我研究了 EF+ 的 Future 功能,但它缺乏 EF Core 的异步功能。因此,我更喜欢使用异步支持对数据库进行 2 次往返。
  • @kipusoep - 你检查过这个链接吗? entityframework-plus.net/ef-core-query-future
  • 是的,为什么?
  • @kipusoep- 呵呵,我以为它有异步方法。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多