【发布时间】:2017-08-23 07:06:16
【问题描述】:
嘿,我有以下代码:
Func<Assoc, bool> predicate = (x) =>
(
!String.IsNullOrWhiteSpace(version) ? x.Version.Contains(version) : x.Version != null
);
var assocs = _context.Assoc
.Where(x => x.Model == model)
.Where(predicate)
;
但它不起作用。如果我尝试执行此服务器会给我内部服务器异常但如果我将其更改为
var assocs = _context.Assoc
.Where(x => x.Model == model)
.Where(x => x.Version.Contains(version))
;
它按我的预期工作。
这是为什么呢?
是否可以预览 Linq 生成的查询?
【问题讨论】:
-
EF 无法解释您必须构建一个表达式的代码,该表达式可以翻译成 SQL。也许这对你有帮助stackoverflow.com/questions/35346630/…
-
是否需要使用谓词?您总是可以使用 && 在 Linq 中归档相同的语句。例如,创建一个返回 bool 的方法并将其插入 && 子句。
-
使用谓词会很棒,因为不需要版本,所以我决定像上面那样使用谓词。这很奇怪,因为在其他类似的方法中它可以正常工作
-
请阅读@RandRandom 链接文章。您必须为所有
IQueryable<T>传递表达式 (Expression<Func<TEntity,TResult>>) 而不是委托 (Func<TEntity, TResult>)。对于IEnumerable<T>,delgate 也可以工作,因为它确实在内存中评估它。但是IQueryable<T>需要翻译成SQL,所以必须是表达式 -
您的错误来自语句周围的括号。使用方括号时,如果没有 return 语句,它不会自动返回。
标签: c# linq asp.net-core