c# - Linq 到实体 : Where In with 1 value and many columns

标签 c# sql linq-to-entities

我知道在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/

相关文章:

mysql - 基于第一次出现的sql动态限制

c# - 从一个 IList<> 中移除另一个 IList<> 中的项目

C# foreach 语句未正确将模型添加到模型列表

sql - 从 sql server 中的字符串转换日期和/或时间时转换失败

sql - Codeigniter 事件记录所在数组

entity-framework - 在 EF 查询中包含孙子

entity-framework - Entity Framework 4/POCO - 从哪里开始?

c# - 在异常日志记录中跟踪用户 ID

c# - 为什么我们不能序列化从接口(interface)派生的具体类?

c# - 来自 MSDN 的 XmlSerializer 示例失败