gpt4 book ai didi

entity-framework - EntityFramework 计数查询结果 vs 计数列表

转载 作者:行者123 更新时间:2023-12-04 07:24:06 24 4
gpt4 key购买 nike

efQuery.ToList().CountefQuery.Count()产生相同的值(value)?
efQuery.ToList().Count怎么可能和 efQuery.Count()不产生相同的值(value)?

//GetQuery() returns a default IDbSet which is used in EntityFramework

using (var ds = _provider.DataSource())
{
//return GetQuery(ds, filters).Count(); //returns 0???
return GetQuery(ds, filters).ToList().Count; //returns 605 which is correct based on filters
}

最佳答案

我自己就遇到了这个。在我的情况下,问题是查询有一个 .Select() 子句,它导致建立进一步的关系,最终进一步过滤查询,因为关系内连接限制了结果。

似乎 .Count() 不处理查询的 .Select() 部分。

所以我有:

// projection created
var ordersData = orders.Select( ord => new OrderData() {
OrderId = ord.OrderId,
... more simple 1 - 1 order maps

// Related values that cause relations in SQL
TotalItemsCost = ord.OrderLines.Sum(lin => lin.Qty*lin.Price),
CustomerName = ord.Customer.Name,
};


var count = ordersData.Count(); // 207
var count = ordersData.ToList().Count // 192

当我比较 SQL 语句时,我发现 Count() 在返回所有订单的 Orders 表上做了一个非常简单的 SUM,而第二个查询是 100 多行 SQL 的怪物,它有 10 个由 . Select() 子句(检索到的相关值/聚合比此处显示的要多一些)。

基本上,这似乎表明 .Count() 在进行计数时没有考虑 .Select() 子句,因此不会为 .Count() 触发导致进一步限制结果集的相同关系。

我已经能够通过向 .Count() 方法显式添加表达式来完成这项工作,这些表达式会引入一些聚合结果值,这些值也有效地强制它们进入 .Count() 查询:
var count = ordersData.Count( o=> o.TotalItemsCost != -999 &&
o.Customer.Name != "!@#"); // 207

关键是确保计算或提取相关数据并导致关系触发的任何字段都包含在强制 Count() 在其查询中包含所需关系的表达式中。

我意识到这是一个彻头彻尾的黑客,我希望有更好的方法,但就目前而言,这使我们至少能够获得正确的值(value),而无需先使用 .ToList() 拉取大量数据。

关于entity-framework - EntityFramework 计数查询结果 vs 计数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com