【问题标题】:DbExpressionBinding requires an input expression with a collection ResultTypeDbExpressionBinding 需要带有集合 ResultType 的输入表达式
【发布时间】:2014-09-03 20:26:06
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    顺便说一句,分配给c 的查询也不起作用 - Tuple.Create 不能转换为 SQL,ObjTypes[x.RecType] 也不能。您需要在变量 b 上调用 ToList,然后才能对结果进行所有额外的调整。

    【讨论】:

    • 这就是为什么我们使用有意义的变量名作为参数,即使是 lambdas。
    • @dc7a9163d9 KeyValuePair 的构造不受支持。只需完全删除 Select 并在 ToDictionary 调用中进行投影。
    • @Servy,好建议,这比调用ToList 更有效。
    • 如果您只是要调用该列表中的另一个 LINQ 方法,则基本上不应该使用 ToList。它急切地评估查询,创建一个列表,并完全不必要地填充它。使用ToList 的唯一原因是当查询完全完成并且急切实现很重要时。
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多