C# Linq to Entities:其中In具有1个值和多个列

C# Linq to Entities:其中In具有1个值和多个列,c#,sql,linq-to-entities,C#,Sql,Linq To Entities,我知道在sql中,您可以这样做 WHERE 'val' IN (field1, field2, field3, field4, ...) 我想知道是否有一种方法可以使用Linq来做类似的事情?我现在唯一能想到的就是创建一个巨大的“或”语句,列出我想搜索的字段,如下所示 .where(m => m.field1.Contains('val') || m.field2.Contains('val') || m.field3.Contains('val') ||

我知道在sql中,您可以这样做

WHERE 'val' IN (field1, field2, field3, field4, ...)
我想知道是否有一种方法可以使用Linq来做类似的事情?我现在唯一能想到的就是创建一个巨大的“或”语句,列出我想搜索的字段,如下所示

.where(m => 
    m.field1.Contains('val') ||
    m.field2.Contains('val') ||
    m.field3.Contains('val') ||
    m.field4.Contains('val'));
有没有更干净的方法来编写此搜索,或者我的搜索结果是否与它一样好?

您可以这样做

.Where(f => new string[] { f.field1, f.field2, f.field3 }.Any(s => s.Contains("val")));
具有您发布的代码的行为,或

.Where(f => new string[] { f.field1, f.field2, f.field3 }.Contains("val"));
检查是否相等

但我不能说这是否是一个关于性能的好主意

下面是一个代码示例:

public class ClassWithFields
{
    public int Id { get; set; }
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 {get;set;}
}


public class Program
{
    public static void Main()
    {
        var listFields = new List<ClassWithFields>()
        {
                new ClassWithFields { Id = 1, Field1 = "val", Field2 = "qewr", Field3 = "asdqw" },
                new ClassWithFields { Id = 2, Field1 = "asdf", Field2 = "asdd", Field3 = "asdqw" },
                new ClassWithFields { Id = 3, Field1 = "asdf", Field2 = "qewr", Field3 = "qwvaleqwe" }
        };

        var containsVal = listFields.Where(f => new string[] { f.Field1, f.Field2, f.Field3 }.Any(s => s.Contains("val")));
        var equalsVal = listFields.Where(f => new string[] { f.Field1, f.Field2, f.Field3 }.Contains("val"));
    }
}
带有字段的公共类
{
公共int Id{get;set;}
公共字符串字段1{get;set;}
公共字符串字段2{get;set;}
公共字符串字段3{get;set;}
}
公共课程
{
公共静态void Main()
{
var listFields=新列表()
{
新类包含字段{Id=1,Field1=“val”,Field2=“qewr”,Field3=“asdqw”},
新类包含字段{Id=2,Field1=“asdf”,Field2=“asdd”,Field3=“asdqw”},
新类包含字段{Id=3,Field1=“asdf”,Field2=“qewr”,Field3=“qwvaleqwe”}
};
var containsVal=listFields.Where(f=>newstring[]{f.Field1,f.Field2,f.Field3}.Any(s=>s.Contains(“val”));
var equalsVal=listFields.Where(f=>newstring[]{f.Field1,f.Field2,f.Field3}.Contains(“val”);
}
}
您可以在

运行它,因为在SQL上检查相等性,而在SQL上检查包含类似于。此外,您使用'而不是'包围字符串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()时要小心,您可能需要添加BidingAttribute,因为它检索每个(公共)属性

现在,只需在linq上使用新的bool方法即可:(这不是一个根据上下文确定性能的好主意)

尽管所有这些都是可能的,但您可能会遇到架构问题,因为您将很快失去引用,因为此linq查询将返回在任何字段上具有该值的任何对象;而不指定哪个字段


可能有更好的方法来做你想做的事情。

看看这是否是一个可能的解决方案…那篇文章不涉及实体上的多个字段,因为“类型”只是实体上的一个字段。这不是工作方式。它进行等式比较,而不是
包含
.where(m => FieldSearch(m,"val"))