new Item { Total = c.Items.Count((Func)(t => t.Amount.Ha-6ren">
gpt4 book ai didi

c# - 类型转换 LINQ 表达式抛出 "Internal .NET Framework Data Provider error 1025."

转载 作者:太空狗 更新时间:2023-10-29 22:18:58 29 4
gpt4 key购买 nike

以下代码:

model.Items = dbQuery.Select(c => new Item {
Total = c.Items.Count((Func<Item, bool>)(t => t.Amount.HasValue))
}).ToArray();

抛出以下异常:

Internal .NET Framework Data Provider error 1025.

然而,减去转换后的确切代码是有效的:

model.Items = dbQuery.Select(c => new Item {
Total = c.Items.Count(t => t.Amount.HasValue)
}).ToArray();

备注:dbQuery只是一个 EF ObjectQuery .

Count() 的预期类型是Func<Item, bool> ...

但是,异常证明它们不是,实际上在功能上是等价的。

此外,我确实看到了 this related question/answer ,但是Count() (在这种情况下,无论如何)不会接受 Expression<Func<Item bool>> ,所以这对我不起作用。

最佳答案

您希望“将 [the] 表达式存储在一个变量中,以便重用,并将其传递给 Count()”。如果可以将 Expression 转换为 SQL,则这是 100% 可能的。这里的问题是您引入了一些不能被翻译成SQL 的东西。这种情况下的特殊问题是转换被转换为 Expression.Convert。您的类型肯定不会在 SQL 中表示,因此无法执行。将两者都插入 LINQPad 并检查 IL 以查看差异。

正如您链接到的其他相关问题/答案所建议的那样,您需要将谓词作为 Expression 而不是 Func 传递(如何 完成工作与指向代码中完成工作的位置)。正如您所指出的,问题在于 Count 方法不采用 Expression,但这可以通过使用 AsQueryable() 轻松解决这将为您提供采用 ExpressionIQueryable 扩展方法。

执行应该没有问题:

Expression<Func<Item,bool>> predicate = i => i.Amount.HasValue;

model.Items = dbQuery.Select(c => new Item {
Total = c.Items.AsQueryable().Count(predicate)
}).ToArray();

关于c# - 类型转换 LINQ 表达式抛出 "Internal .NET Framework Data Provider error 1025.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24765269/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com