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

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

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

我该怎么做?

【问题讨论】:

    标签: sql linq contains


    【解决方案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();
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-05-10
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多