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

本文关键字:集合 ResultType 表达式 输入 一个 DbExpressionBinding | 更新日期: 2023-09-27 18:20:29

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

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);

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

您的GroupBy调用有点错误-它忽略了cnt参数。应该这样写:

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

这个异常消息是我见过的最没有帮助的消息之一。问题是,当您在C#表达式中对RecordType(别名为k)调用Count时,它编译得很好,因为string实现了IEnumerable<char>。不幸的是,当EF试图将该表达式转换为SQL时,它需要能够使用SQL count运算符,而该运算符不能在string上工作——它需要对一系列行进行操作。这会导致您收到一个有点神秘的异常。

顺便说一句,分配给c的查询也不起作用——Tuple.Create不能翻译成SQL,ObjTypes[x.RecType]也不能。您需要在变量b上调用ToList,然后才能对结果进行所有其他整形。