[英]Linq-to-entities, get results + row count in one query
我已经看到有关此问题的多个问题,但是它们已经存在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事件探查器:
-- 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();
}
我错过了什么? 根据我的探查器,除查询中添加的行(-查询#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();
不再支持此'EntityFramework.Extended'库,请改用该实体库: Entityframework-plus,然后转到: https : //entityframework-plus.net/query-future ,以了解如何在同一查询中获取计数和记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.