LINQ语法 - 标准的排序

时间:2017-07-25 09:57:09

标签: 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));

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

由于

2 个答案:

答案 0 :(得分:1)

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

唯一正确的方法是搜索PersonId集合中PersonIDsWithThisPostcode - 查询,该查询返回所有匹配的PersonId。 单个PersonID不包含集合,但PersonId的集合包含单个PersonId

所以这是正确的,它会返回PersonId在另一个序列中的所有人:

persons = persons.Where(ps => PersonIDsWithThisPostcode.Contains(ps.PersonID));

而这不是:

persons = persons.Where(ps => ps.PersonID.Contains(PersonIDsWithThisPostcode));

答案 1 :(得分:1)

与SQL相比,语法相反,考虑到C#和SQL是两种不同的语言,这应该不足为奇。

在SQL中,您将列表放在右侧,因为IN运算符会在集合中读取&#34;项&#34;

WHERE someId IN (100, 102, 113, 200, 219)

在C#中,不考虑LINQ,使用代码读取&#34;集合包含项目&#34;

来检查集合是否包含项目
myList.Contains(someId);

当您在LINQ中使用Contains转换为SQL时,LINQ提供程序将一种语法转换为另一种语法,以防止C#程序员思考这些差异。