EF 6:查询的结果不能多​​次枚举

时间:2013-12-18 16:40:14

标签: c# entity-framework

有没有办法在不使用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吗?

谢谢!

2 个答案:

答案 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个信息。