与SQL IN运算符等效的linq是什么

时间:2010-02-25 13:43:25

标签: sql linq contains

使用linq我必须检查数组中是否存在行的值 相当于sql查询:

WHERE ID IN (2,3,4,5)

我该怎么做?

9 个答案:

答案 0 :(得分:48)

。载

var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x

当然,对于你的简单问题,你可以有类似的东西:

var resultset = from x in collection where x >= 2 && x <= 5 select x

答案 1 :(得分:25)

使用IEnumerable.Contains()执行等效的SQL IN。

var idlist = new int[] { 2, 3, 4, 5 };

var result = from x in source
          where idlist.Contains(x.Id)
          select x;

答案 2 :(得分:10)

db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));

from x in db.SomeTable
where new[] {2,3,4,5}.Contains(x)

答案 3 :(得分:8)

Intersect和Except更简洁,也可能更快一点。

collection.Intersect(new[] {2,3,4,5});

不在

collection.Except(new[] {2,3,4,5});

IN

的方法语法
collection.Where(x => new[] {2,3,4,5}.Contains(x));

而不是

collection.Where(x => !(new[] {2,3,4,5}.Contains(x)));

答案 4 :(得分:3)

IEnumerable<T>.Contains(T)语句应该可以满足您的需求。

答案 5 :(得分:2)

使用.Contains()

的一个非常基本的例子
List<int> list = new List<int>();
for (int k = 1; k < 10; k++)
{
    list.Add(k);
}

int[] conditionList = new int[]{2,3,4};

var a = (from test in list
         where conditionList.Contains(test)
         select test);

答案 6 :(得分:1)

您可以编写帮助方法:

    public bool Contains(int x, params int[] set) {
        return set.Contains(x);
    }

并使用短代码:

    var resultset = from x in collection
                    where Contains(x, 2, 3, 4, 5)
                    select x;

答案 7 :(得分:0)

以下是一种通用扩展方法,可用于搜索值列表中的值:

    public static bool In<T>(this T searchValue, params T[] valuesToSearch)
    {
        if (valuesToSearch == null)
            return false;
        for (int i = 0; i < valuesToSearch.Length; i++)
            if (searchValue.Equals(valuesToSearch[i]))
                return true;

        return false;
    }

这可以用作:

int i = 5;
i.In(45, 44, 5, 234); // Returns true

string s = "test";
s.In("aa", "b", "c"); // Returns false

这在条件陈述中很方便。

答案 8 :(得分:0)

在将Contains函数用于基元时上述情况有效,但是如果要处理对象(例如myListOrArrayOfObjs.Contains(efObj))怎么办?

我找到了解决方案!将您的efObj转换为string,每个字段之间用_分隔(您几乎可以将其视为obj的CSV表示形式)

此类示例可能如下所示:

     var reqAssetsDataStringRep = new List<string>();

        foreach (var ra in onDemandQueueJobRequest.RequestedAssets)
        {
            reqAssetsDataStringRep.Add(ra.RequestedAssetId + "_" + ra.ImageId);
        }

        var requestedAssets = await (from reqAsset in DbContext.RequestedAssets
                                     join image in DbContext.Images on reqAsset.ImageId equals image.Id
                                     where reqAssetsDataStringRep.Contains(reqAsset.Id + "_" + image.Id)
                                     select reqAsset
                                           ).ToListAsync();