使用Entity Framework时,获取相同数据库中的总计数和页面行数

时间:2014-06-14 16:02:25

标签: c# entity-framework-4

我目前正在使用以下方法获取客户页面以及总计数。唯一的问题是我正在进行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

2 个答案:

答案 0 :(得分:1)

我在这个问题上思考和研究了很多。目前,使用EF 6,有两种良好做法:

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

Entity Framework Sprocs with Multiple Result Sets

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

答案 1 :(得分:-3)

根据数据库往返的成本和返回的项目数量,可能更快/更容易执行一次基本查询并在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?