Skip to main content
 首页 » 编程设计

c#之在 Entity Framework 4.1 中查询一页数据并获取总计数的更好方法

2024年04月12日14think

当前,当我需要运行将与分页一起使用的查询时,我会这样做:

//Setup query (Typically much more complex) 
var q = ctx.People.Where(p=>p.Name.StartsWith("A")); 
 
//Get total result count prior to sorting 
int total = q.Count();        
 
//Apply sort to query 
q = q.OrderBy(p => p.Name);   
 
q.Select(p => new PersonResult 
{ 
   Name = p.Name 
}.Skip(skipRows).Take(pageSize).ToArray(); 

这可行,但我想知道是否可以在仍然使用 linq 的情况下改进它以提高效率?我想不出一种方法可以将计数与数据检索结合到一次数据库访问中,而无需使用存储过程。

请您参考如下方法:

下面的查询将在一次数据库访问中获取计数和页结果,但是如果您检查 LINQPad 中的 SQL,您会发现它不是很漂亮。我只能想象更复杂的查询会是什么样子。

var query = ctx.People.Where (p => p.Name.StartsWith("A")); 
 
var page = query.OrderBy (p => p.Name) 
                .Select (p => new PersonResult { Name = p.Name } )           
                .Skip(skipRows).Take(pageSize) 
                .GroupBy (p => new { Total = query.Count() }) 
                .First(); 
 
int total = page.Key.Total; 
var people = page.Select(p => p); 

对于像这样的简单查询,您可能会使用任一方法(2 次访问数据库,或使用 GroupBy 在 1 次行程中完成),并且不会注意到太大差异。对于任何复杂的事情,我认为存储过程将是最好的解决方案。