gpt4 book ai didi

c# - 如何简化 Where(e => e.prop1.contains() || e.prop2.contains() || ...) 中的重复 OR 条件

转载 作者:行者123 更新时间:2023-12-04 08:00:06 27 4
gpt4 key购买 nike

我有很多这样的代码:

IQueryable<MyEntity> query...
query.Where(e => EF.Functions.Like(e.Property1, pattern)
|| EF.Functions.Like(e.Property2, pattern)
|| EF.Functions.Like(e.Property3, pattern)
...);
我如何简化它以将重复代码删除为这样的:
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 条件不能只是任何返回 bool 值的函数。它必须是可翻译的 Expression >

最佳答案

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

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 是双重否定:
WHERE NOT EXISTS (SELECT 1
FROM (VALUES
(e.Property1),
(e.Property2),
(e.Property3)
) v(Prop)
WHERE v.Prop NOT LIKE @pattern
)

关于c# - 如何简化 Where(e => e.prop1.contains() || e.prop2.contains() || ...) 中的重复 OR 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66516488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com