LINQ语句的Where子句用于查找List <string>集合中的字符串实例?</string>

时间:2011-08-08 16:31:07

标签: c# linq linq-to-objects

我正在尝试为Linq语句构造Where子句,该语句需要确定 List<string> 集合中是否存在如下检索的 AccountNumber

我到目前为止尝试过这个:

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&gt;)'不能   从用法推断。尝试指定类型参数   明确。

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

6 个答案:

答案 0 :(得分:8)

我想你想要这个:

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

答案 1 :(得分:2)

这不起作用?

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

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

答案 2 :(得分:1)

因为你的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&lt; string&gt;
  • 版本2将返回IEnumerable&lt; string&gt;
  • 版本3将返回IEnumerable&lt; abc&gt;
  • 中项目的类型
  • 版本4将返回bool

答案 3 :(得分:0)

让我核实你要做的事情。

您有一组对象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;
}

答案 4 :(得分:0)

我会这样做:

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

答案 5 :(得分:-2)

最后一个答案是错误的,因为确实提到了一个重点并且显然没有经过测试,第一个问题是,你不能在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和实体框架时,有必要提一下这个解决方案!