DbExpressionBinding需要一个带有ResultType集合的输入表达式

时间:2014-09-03 20:26:06

标签: c# entity-framework linq linq-to-entities

我想按列对表进行分组并获取计数,然后使用结果创建字典。最后一个语句返回错误

  

DbExpressionBinding需要一个带有ResultType集合的输入表达式。

错误意味着什么?

var a = context.Table;
var b = a.GroupBy(x => x.RecordType, (k, cnt) => new { RecType = k, cnt = k.Count() });
var c = b.Select(x => 
    new KeyValuePair<string, Tuple<Type, int>>(
        x.RecType, Tuple.Create(ObjTypes[x.RecType], x.cnt)))
    .ToDictionary(x => x.Key, x => x.Value);

1 个答案:

答案 0 :(得分:3)

您的GroupBy电话略有错误 - 它忽略了cnt参数。它应该写成这样:

var b = a.GroupBy(x => x.RecordType, (k, cnt) => new { RecType = k, cnt = cnt.Count() });

该异常消息是我见过的无用之一。问题是,当您在C#表达式中调用Count上的RecordType(别名为k)时,编译正常,因为string实现了IEnumerable<char>。不幸的是,当EF尝试将该表达式转换为SQL时,它需要能够使用SQL count运算符,该运算符不能在string上运行 - 它需要在一个序列上运行行。这导致你收到的有点神秘的例外。

顺便提一下,分配给c的查询无法正常工作 - Tuple.Create无法转换为SQL,ObjTypes[x.RecType]也无法转换为ToList。您需要在变量b上致电{{1}},然后才能对结果进行额外的整形。