【问题标题】:Where clause of LINQ statement to find instances of a string within a List<string> collection?LINQ 语句的 Where 子句在 List<string> 集合中查找字符串的实例?
【发布时间】:2023-03-10 17:54:01
【问题描述】:

我正在尝试为 Linq 语句构建 Where 子句,该语句需要确定如下检索到的 AccountNumber 值是否存在于 List&lt;string&gt; 集合中。

到目前为止,我已经尝试过:

private void FindAccountNumbers(List<string> AccountNumbers)
{
    var query = from abc 
    select new
    {
        AccountNumber = abc.AccountNumber
    };

    query = query.Where(AccountNumbers.Contains(x => x.AccountNumber));
}

但是我得到以下构建错误:

方法的类型参数 'System.Linq.Queryable.Where(System.Linq.IQueryable, System.Linq.Expressions.Expression>)' 不能 从用法推断。尝试指定类型参数 明确的。

在运行时,query 包含 AccountNumber 值,我正试图根据在 AccountNumbers 集合中找到的匹配项来减少它(类似于 IN TSQL 中的语句)。我应该使用Intersect 而不是Contains 吗?我究竟做错了什么??

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    我想你想要这个:

    query = query.Where(x => AccountNumbers.Contains(x.AccountNumber));
    

    【讨论】:

      【解决方案2】:

      这不起作用?

      var query = from x in abc
                  where AccountNumbers.Contains(x.AccountNumber)
                  select new { x.AccountNumber };
      

      这将返回该列表中的任何 AccountNumber,除非 AccountNumber 实际上不是字符串。那可能是你的问题。

      【讨论】:

      • 语法错误,应该是from x in abc,然后用x替换所有其他出现的abc
      【解决方案3】:

      这是因为您的 from 语法错误,我猜您的集合是要匹配的项目的 abc 是 abc

      正确的语法应该是(版本 1)

      var query = from x in abc
                  select new  { AccountNumber = x.AccountNumber };
      
      query = query.Where(x=>AccountNumbers.Contains(x.AccountNumber));
      

      你也不需要做匿名类型,因为你只想要你可以做的相同字段(版本 2)

      var query = from x in abc select x.AccountNumber;
      query = query.Where(x=>AccountNumbers.Contains(x));
      

      但是,您可以将 Where 直接添加到您的原始收藏中。 (第 3 版)

      var query = abc.Where(x=>AccountNumbers.Contains(x.AccountNumber);
      

      或者,如果您只是想查找集合中是否存在任何内容(版本 4)

      var query = abc.Any(x=>AccountNumbers.Countains(x.AccountNumber);
      
      • 版本 1 将返回 IEnumerable
      • 版本 2 将返回 IEnumerable
      • 版本 3 将返回 IEnumerable
      • 版本 4 将返回 bool

      【讨论】:

        【解决方案4】:

        让我验证一下你要做什么。

        您有一个对象集合abc。您想从该集合的每个成员中提取 AccountNumber,将其与传入的帐号列表进行比较,然后确定……什么?如果有任何重叠,或者重叠是什么?

        如果 AccountNumber 字段是字符串,您可以这样做:

        private IEnumerable<string> OverlappingAccountNumbers(IEnumerable<string> accountNumbers)
        {
            return abc.Select(x => x.AccountNumber)
                      .Intersect(accountNumbers);
        }
        

        或者对于布尔值:

        private bool AnyOverlappingAccountNumbers(IEnumerable<string> accountNumbers)
        {
            return abc.Select(x => x.AccountNumber)
                      .Intersect(accountNumbers)
                      .Count() > 0;
        }
        

        【讨论】:

        • 他需要匹配一个集合,所以这行不通。
        【解决方案5】:

        我会选择这个:

        private void FindAccountNumbers(List<string> AccountNumbers)
        {
            // Get a strongly-typed list, instead of an anonymous typed one...
            var query = (from a in abc select a.AccountNumber).AsEnumerable();
        
            // Grab a quick intersect
            var matched = query.Intersect(AccountNumbers)
        }
        

        一个班轮?

        var query = (from a in abc select a.AccountNumber).AsEnumerable().Intersect(AccountNumbers);
        

        【讨论】:

          【解决方案6】:

          最后一个答案是错误的,因为确实提到了一个重点,显然没有经过测试,第一个问题是,你不能在未执行的 sql 查询和字符串列表之间混合,你不能混合!!!这个问题的解决方案和测试是:

          var AccountNumbers = select accountNumber from table where.... // is a entitie
              private void FindAccountNumbers(IQueryable<acounts> AccountNumbers) //entitie object not   string
              {
                  var query = from abc 
                  select new
                  {
                      AccountNumber = abc.AccountNumber
                  };
          
                  query = query.Join(AccountNumbers, abc => abc.AccountNumber, aco=> aco, (ac, coNum) => cpac);
              }
          

          真的好用!有必要提到这个解决方案是当您使用 linq 和实体框架时!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多