将谓词传递给LINQ where子句

时间:2017-08-23 07:06:17

标签: c# linq asp.net-core

嘿,我有以下代码:

    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生成的查询?

2 个答案:

答案 0 :(得分:0)

使用LINQKit,您可以创建将为您扩展的谓词,以便您可以在IQueryable表达式中使用它们,但是您不需要这样做只是为了排除版本测试。

var assocs = _context.Assoc
             .Where(x => x.Model == model);
if (!String.IsNullOrWhiteSpace(version))
    assocs = assocs.Where(x.Version.Contains(version));

答案 1 :(得分:-1)

因为EF可以将from bs4 import BeautifulSoup soup = BeautifulSoup(open('myhtml.html'), 'html.parser') currently_watching = soup.find('h2', text='Something really cool here') parent = currently_watching.parent 方法翻译成sql(Contains),但不评估您的“外部”功能。

如果将结果加载到memroy(通过导出方法为Version LIKE '%@version%'),则可以将其作为linq2object执行:

ToList()

我的代码显示并说明但绝对不推荐,因为质疑数据库比处理内存更好。