Jer*_*ose 5 c# linq entity-framework
以下代码:
model.Items = dbQuery.Select(c => new Item {
Total = c.Items.Count((Func<Item, bool>)(t => t.Amount.HasValue))
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
引发以下异常:
内部.NET Framework数据提供程序错误1025.
但是,确切的代码减去演员表:
model.Items = dbQuery.Select(c => new Item {
Total = c.Items.Count(t => t.Amount.HasValue)
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
注意:dbQuery只是一个EF ObjectQuery.
Count()is 的预期类型Func<Item, bool>,甚至由ReSharper验证它们是相同的类型,因为它灰化了抛出,表明它不是必需的,它们在功能上是等价的.
但是,例外证明它们实际上并不是功能相同的.
另外,我确实看到了这个相关的问题/答案,但是Count()(在这种情况下,无论如何)都不会接受Expression<Func<Item bool>>,所以这对我不起作用.
Oce*_*t20 11
您希望"将[表达式]存储在变量中,以便重用,并将其传递给Count()".如果Expression可以将其转换为SQL,那么这是100%可能的.这里的问题是你引入了一些无法翻译成SQL的东西.在这种情况下的特殊问题是演员被转换为Expression.Convert.您的类型肯定不会在SQL中表示,因此无法执行.将两者插入LINQPad并检查IL以查看差异.
正如您链接的其他相关问题/答案所暗示的那样,您需要将谓词作为一个Expression而不是一个Func(如何执行工作而不是指向执行工作的代码中的位置).正如您所指出的,问题在于该Count方法不会采用Expression,但通过使用AsQueryable()可以轻松解决这个问题,这将为您提供所需的IQueryable扩展方法Expression.
执行时应该没有问题:
Expression<Func<Item,bool>> predicate = i => i.Amount.HasValue;
model.Items = dbQuery.Select(c => new Item {
Total = c.Items.AsQueryable().Count(predicate)
}).ToArray();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3139 次 |
| 最近记录: |