Linq-to-entities,在一个查询中获取结果+行数

我已经看到了关于这个问题的多个问题,但它们已经2年(或更长)了,所以我想知道是否有任何改变。

基本思想是填充gridview并创建自定义分页。 所以,我也需要结果和行数。

在SQL中,这将是这样的:

SELECT COUNT(id), Id, Name... FROM ... WHERE ... 

在一个简单的查询中获取所有内容。 但是,我想保持一致并使用Linq2Entities。

到目前为止,我使用的方法有两个查询(针对sql server),因为它只是起作用。 我想优化它,然后使用单个查询。

我试过这个:

 var query = from o in _db.Products select o; var prods = from o in query select new { Count = query.Count(), Products = query }; 

这产生了一个非常讨厌和长的查询,真正不必要的交叉连接和其他我不需要或不想要的东西。

有没有办法在一个简单的查询中获取分页结果+所有实体的数量? 这里推荐的方法是什么?

更新:

刚试过FutureQueries,我做错了什么,或者它实际上执行了两个查询。 这显示了我的sql profiler:

 -- Query #1 SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT COUNT(1) AS [A1] FROM [dbo].[Products] AS [Extent1] WHERE 1 = [Extent1].[CategoryID] ) AS [GroupBy1]; 

下一行:

 -- Query #1 SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name], [Extent1].[Price] AS [Price], [Extent1].[CategoryID] AS [CategoryID] FROM [dbo].[Products] AS [Extent1] WHERE 1 = [Extent1].[CategoryID]; 

C#代码:

 internal static List GetProducts(out int _count) { DatabaseEntities _db = new DatabaseEntities(); var query = from o in _db.Products where o.CategoryID == 1 select o; var count = query.FutureCount(); _count = count.Value; return query.Future().ToList(); } 

我错过了什么? 根据我的分析器,除了在查询中添加行( – 查询#1)之外,它完全相同。

在EntityFramework.Extended中查看Future Queries。 该链接页面上的第二个示例使用FutureCount()来完成您想要的操作。 改编在这里:

 var q = db.Products.Where(p => ...); var qCount = q.FutureCount(); var qPage = q.Skip((pageNumber-1)*pageSize).Take(pageSize).Future(); int total = qCount.Value; // Both queries are sent to the DB here. var tasks = qPage.ToList();