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();