更好的方式来查询一个页面的数据,并获得总数在entity framework4.1?

目前,当我需要运行一个查询,将使用瓦特/分页我这样做是这样的:

//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? 我想不出一种方法来结合使用存储过程一次访问数据库的数据检索数据库。

下面的查询会在一次到达数据库的时候得到count和page结果,但是如果你在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次旅行),并没有注意到太多的差异。 对于任何复杂的事情,我认为存储过程将是最好的解决scheme。

我build议为第一页做两个查询,一个用于总数,另一个用于第一页或结果。

在超出第一页时caching使用的总数。