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