如何简化 Where(e => e.prop1.contains() || e.prop2.contains() || ...) 中的重复 OR 条件 [英] How to simplify repetitive OR condition in Where(e => e.prop1.contains() || e.prop2.contains() || ...)

查看:14
本文介绍了如何简化 Where(e => e.prop1.contains() || e.prop2.contains() || ...) 中的重复 OR 条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有很多这样的代码:

IQueryable<MyEntity> query...
query.Where(e => EF.Functions.Like(e.Property1,  pattern)
                || EF.Functions.Like(e.Property2, pattern)
                || EF.Functions.Like(e.Property3, pattern)
                ...);

我如何简化它以将重复代码删除为这样的:

How can I simplify it to remove the repetitive code to something like this:

query.Where(Search(pattern, e => e.Property1, e => e.Property2, e => e.Property3));  

query.Where(e => Search(pattern, e.Property1,  e.Property2,  e.Property3))  

查询必须由 EF 转换为 SQL,因此 where 条件不能只是任何返回布尔值的函数.它必须是可翻译的 Expression>

The query must be translated to SQL by EF, so the where condition can't be just any function that return boolean. It must be translatable Expression<Func<TEntity, bool>>

推荐答案

您可以重写它以将所有属性组合到一个数组中并检查是否匹配:

You can rewrite it to combine all the properties into an array and check that for a match:

query.Where(e =>
    new[]{ e.Property1, e.Property2, e.Property3}
      .Any(p => EF.Functions.Like(p, pattern) )
);

等效的 SQL 是:

WHERE EXISTS (SELECT 1
    FROM (VALUES
      (e.Property1),
      (e.Property2),
      (e.Property3)
    ) v(Prop)
    WHERE v.Prop LIKE @pattern
)


等效的 &&/AND 语义略有不同:

query.Where(e =>
    new[]{ e.Property1, e.Property2, e.Property3}
      .All(p => EF.Functions.Like(p, pattern) )
);

等效的 SQL 是双重否定:

The equivalent SQL is a double-negative:

WHERE NOT EXISTS (SELECT 1
    FROM (VALUES
      (e.Property1),
      (e.Property2),
      (e.Property3)
    ) v(Prop)
    WHERE v.Prop NOT LIKE @pattern
)

这篇关于如何简化 Where(e => e.prop1.contains() || e.prop2.contains() || ...) 中的重复 OR 条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆