当前,当我需要运行将与分页一起使用的查询时,我会这样做:
//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 次行程中完成),并且不会注意到太大差异。对于任何复杂的事情,我认为存储过程将是最好的解决方案。