我试图理解LINQ语法并陷入困境。 所以我有这一行,它得到了所有我正在搜索的邮政编码的人
IQueryable<int> PersonIDsWithThisPostcode = _context.Addresses
.Where(pst => pst.Postcode.Contains(p))
.Select(b => b.PersonID);
然后,此行仅返回 PersonIDsWithThisPostcode 中的人员
persons = persons.Where(ps => PersonIDsWithThisPostcode.Contains(ps.PersonID));
我本来希望它是类似这样的东西,你正在查看一个容器,然后检查一个值的子集,看看你想要什么。
persons = persons.Where(ps => ps.PersonID.Contains(PersonIDsWithThisPostcode));
所以从SQL的角度来看,我会这样认为是这样的。
bucket = bucket.Where(bucket.Contains(listoffish));
但它似乎像这样
bucket = bucket.Where(listoffish.Contains(bucket));
我已经阅读了很多文档,但我无法理解这个看似简单的概念。 任何帮助解释这种思维方式将不胜感激。
谢谢
如果PersonID
是int
则不能使用ps.PersonID.Contains
因为int不是集合(或将搜索子字符串的字符串(。
唯一正确的方法是在集合中搜索您的PersonId
,该集合是返回所有匹配PersonId
的PersonIDsWithThisPostcode
查询。 单个PersonID
不包含集合,但PersonId
集合包含单个PersonId
。
所以这是正确的,它返回所有PersonId
在另一个序列中的人:
persons = persons.Where(ps => PersonIDsWithThisPostcode.Contains(ps.PersonID));
这不是:
persons = persons.Where(ps => ps.PersonID.Contains(PersonIDsWithThisPostcode));
与SQL相比,语法是相反的,考虑到C#和SQL是两种不同的语言,这应该不足为奇。
在SQL中,您将列表放在右侧,因为运算符读取IN
"集合中的项">
WHERE someId IN (100, 102, 113, 200, 219)
在 C# 中,不考虑 LINQ,使用读取"集合包含项"的代码检查集合是否包含项
myList.Contains(someId);
在 LINQ中使用转换为 SQL 的Contains
时,LINQ 提供程序会将一种语法转换为另一种语法,以防止 C# 程序员考虑差异。