什么是 linq 等价于 SQL IN 运算符

Posted

技术标签:

【中文标题】什么是 linq 等价于 SQL IN 运算符【英文标题】:What is the linq equivalent to the SQL IN operator 【发布时间】:2011-01-21 00:24:36 【问题描述】:

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

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

我该怎么做?

【问题讨论】:

【参考方案1】:

.包含

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

【讨论】:

我收到错误:int[] does not contain a definition of contains. 可能是因为 System.Linq 不包括在内?【参考方案2】:

IEnumerable&lt;T&gt;.Contains(T) 语句应该可以满足您的需求。

【讨论】:

【参考方案3】:
db.SomeTable.Where(x => new[] 2,3,4,5.Contains(x));

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

【讨论】:

不应该使用与要搜索的数据类型匹配的 x.,在本例中为整数。像 db.sometable.where(x => new[] 1,2.Contains(x.Id));【参考方案4】:

使用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;

【讨论】:

【参考方案5】:

一个非常基本的使用 .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);

【讨论】:

您可以通过将 for 循环更改为 IEnumerable&lt;int&gt; list = Enumerable.Range(1, 10); 来清理很多内容 点了。 +1 但公平地说,我只是在编写我知道无需测试就可以工作的代码:)【参考方案6】:

你可以编写帮助方法:

    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】:

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)));

【讨论】:

【参考方案8】:

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

    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

这在条件语句中很方便。

【讨论】:

【参考方案9】:

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();

【讨论】:

以上是关于什么是 linq 等价于 SQL IN 运算符的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB条件查询(比较运算) --- 2022-04-03

为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash&(h-1)=hash%h)位运算公式等价于取余运算?

如何在 Linq 的 Where 条件中使用 IN 运算符

Observable.Do 等价于 Enumerable [重复]

运算符

Dynamics CRM SDK - 带有 OrganizationServiceContext 的 linq 的 IN 运算符