有没有办法在不使用ToList()的情况下避免“查询的结果不能多次枚举”异常?
以下是我的代码的简化版本:
var entities = _db.Trades.Where(t => t.A > 10);
int totalCount = entities.Count();
entities = entities.Where(t => t.B > 10);
int totalCountAfterAdditionalFilter = entities.Count();
由于性能方面的考虑,我无法调用ToList()。我知道我可以再生成一个IQueryable,但这似乎是错误的(我有更多像这样的过滤器)。在我第一次调用Count()之后,我可以以某种方式保留/复制IQueryable吗?
谢谢!
答案 0 :(得分:3)
不,你无法达到理想的效果。但是,您可以将过滤器保存到变量中,然后根据需要进行组合:
Func<Trade, bool> filter1 = t => t.A > 10;
Func<Trade, bool> filter2 = t => t => t.B > 10;
Func<Trade, bool> compositeFilter = t => filter1(t) && filter2(t);
int totalCount = _db.Trades.Count(filter1);
int totalCountAfterAdditionalFilter = _db.Trades.Count(compositeFilter);
//Need more?
compositeFilter = t => compositeFilter(t) && t.C > 100;
int totalAfterMoreFilters = _db.Trades.Count(compositeFilter);
答案 1 :(得分:0)
可能是:
Trades.Where(x => x.A > 10).Select(x => new { i = 1, j = x.B > 10 ? 1 : 0}).
GroupBy(y => y.i).
Select(g => new { c = g.Count(), = g.Sum(z => z.j)})
这会在一个查询中提供2个信息。