c# – 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<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();
点赞