Linq 到实体,在一个查询中获取结果 + 行计数

本文关键字:获取 查询 结果 一个 实体 Linq | 更新日期: 2023-09-27 18:35:11

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

基本思想是填充网格视图并创建自定义分页。所以,我还需要结果和行数。

在 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
            };

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

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

更新:

刚刚尝试了FutureQuery,要么我做错了什么,要么它实际上执行了两个查询。这显示了我的 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)之外,它执行完全相同的操作。

Linq 到实体,在一个查询中获取结果 + 行计数

看看 Future Query 以在 EntityFramework.Extended 中执行此操作。该链接页面上的第二个示例使用 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"库不再受支持,请改用这个库:实体框架加 并转到此处:https://entityframework-plus.net/query-future 查看如何获取计数和记录在同一查询中。