首页 > 解决方案 > Linq to Entities:其中包含 1 个值和许多列

问题描述

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

有没有一种更简洁的方式来编写这个搜索,或者我所拥有的和它一样好?

标签: c#sqllinq-to-entities

解决方案


你可以做

.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运行它


推荐阅读