我知道在sql中你会做这样的事情
WHERE 'val' IN (field1, field2, field3, field4, ...)
我想知道是否有一种方法可以使用 Linq to entities 做类似的事情?我现在唯一能想到的就是为我要搜索的字段创建一个巨大的“或”语句,如下所示
.where(m =>
m.field1.Contains('val') ||
m.field2.Contains('val') ||
m.field3.Contains('val') ||
m.field4.Contains('val'));
是否有一种更简洁的方式来编写此搜索,或者我所拥有的就是最好的?
最佳答案
正如 Theodor Zoulias 所指出的,您没有正确使用 Contains() ,因为 SQL 上的 IN 检查相等性,而 contains 将是 SQL 上的 LIKE。您还用 ' 而不是 " 将字符串 val 括起来,' 仅适用于单个字符。
假设您正在尝试检索任何属性具有特定值的“m”,您将不得不使用反射:
首先创建一个方法来循环遍历一个对象并匹配所需的值
public bool FieldSearch(object a, string b)
{
//Get the type of your object, to loop through its properties
Type t = a.GetType();
//loop and check (the loop stops once the first property that matches has been found!)
foreach(PropertyInfo p in t.GetProperties())
{
if(p.GetValue(a).ToString()==b)
{
return true;
}
}
return false;
}
小心 GetProperties(),您可能想要添加 BidingAttributes,因为它会检索每个(公共(public))属性。
现在只需在您的 linq 上使用您的新 bool 方法:(根据上下文,这不是一个关于性能的好主意)
.where(m => FieldSearch(m,"val"))
虽然所有这些都是可能的,但您可能遇到了体系结构问题,因为您将很快失去引用,因为此 linq 查询返回在任何字段上具有该值的任何对象;无需指定哪个字段。
可能有更好的方法来完成您正在尝试做的事情..
关于c# - Linq 到实体 : Where In with 1 value and many columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56264406/