我已经看到了关于这件事的多个问题,但他们已经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<Product> 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(); }
解决方法
在
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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。