LINQ 语法 - 条件的排序



我试图理解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));

我已经阅读了很多文档,但我无法理解这个看似简单的概念。 任何帮助解释这种思维方式将不胜感激。

谢谢

如果PersonIDint则不能使用ps.PersonID.Contains因为int不是集合(或将搜索子字符串的字符串(。

唯一正确的方法是在集合中搜索您的PersonId,该集合是返回所有匹配PersonIdPersonIDsWithThisPostcode查询。 单个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# 程序员考虑差异。

最新更新