我正在尝试为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
吗?我究竟做错了什么??
答案 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);
答案 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和实体框架时,有必要提一下这个解决方案!