【发布时间】:2014-07-15 18:12:13
【问题描述】:
以下代码:
model.Items = dbQuery.Select(c => new Item {
Total = c.Items.Count((Func<Item, bool>)(t => t.Amount.HasValue))
}).ToArray();
抛出以下异常:
内部 .NET Framework 数据提供程序错误 1025。
但是减去演员表的确切代码是有效的:
model.Items = dbQuery.Select(c => new Item {
Total = c.Items.Count(t => t.Amount.HasValue)
}).ToArray();
注意:dbQuery 只是一个 EF ObjectQuery。
Count() 的预期类型是 Func<Item, bool>,ReSharper 甚至验证了它们是同一类型,因为它会使强制转换为灰色,这表明它不是必需的,并且它们在功能上是等效的。
但是,异常证明它们不,实际上在功能上是等价的。
另外,我确实看到了this related question/answer,但Count()(在这种情况下,无论如何)不会接受Expression<Func<Item bool>>,所以这对我不起作用。
【问题讨论】:
-
那么您为什么要尝试添加一些设计为无用的东西,但这会导致您的代码根本无法工作。如果您这样做时会感到疼痛,请不要这样做。
-
您是否尝试转换为
Espression<Func<Item,bool>>? -
@AlexanderGalkin 他在问题中回答了这个问题。
-
@Servy 为了简单起见,我试图从细节中抽象出实际问题。但这归结为这样一个事实,即我试图在我的(更复杂的)表达式中重用逻辑,并且将此逻辑存储在
Func<Item, bool>中不起作用。但是如果我可以让上面的代码工作,那么我可以解决我更复杂的实际问题。 -
@JeradRose 不,你不能。如果查询提供程序足够健壮,可以期待它,那么您提供的代码理论上是可以工作的。实际上,从表达式中提取代码并将其存储在委托中实际上会从表达式中删除信息,使得查询提供者不可能访问信息,无论其编写得多么健壮。当然,这并不是说不可能将一个表达式分成多个表达式,因为它是,你根本无法通过将代码放在委托中来做到这一点。
标签: c# linq entity-framework