繁体   English   中英

Linq to Entities:其中In具有1值和许多列

[英]Linq to Entities: Where In with 1 value and many columns

我知道在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"));
    }
}

您可以在https://dotnetfiddle.net/lXSoB4上运行它

您没有按照Theodor Zoulias的说明正确使用Contains(),因为SQL上的IN检查相等性,而SQL上的contains将像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,因为它会检索每个 (公共)属性。

现在,只需在linq上使用新的bool方法即可:(根据具体情况,这不是关于性能的好主意)

.where(m => FieldSearch(m,"val"))

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM