2017-07-25 33 views
1

我想了解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)); 

我读过通过大量的文档,但我无法理解这个显而易见的简单概念。任何帮助解释这种思维方式,将不胜感激。

感谢

回答

1

如果PersonIDint你不能使用ps.PersonID.Contains由于int不是一个集合(或字符串,它会搜索字符串)。

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

因此,这是正确的,它返回的所有人员,其PersonId是在其他序列:

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

,这不:

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

的语法比较逆转SQL,这应该毫不奇怪,考虑到C#和SQL是两种不同的语言。

在SQL放置在右侧的列表中,因为IN运营商“在集合项目

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

在C#中读取,而不考虑LINQ,你检查的集合包含使用代码项目写着 “集合包含项目”

myList.Contains(someId); 

当你在LINQ使用Contains是被转换到SQL,LINQ p rovider将一种语法翻译为另一种语法,以防止C#程序员考虑差异。

+0

当检查集合myList.Contains(someId)中的单个ID时是否合理。 但在这种情况下,我有两个集合,一个用于“persons”(一个表中的人员记录集合),另一个用于“PersonIDsWithThisPostcode”(来自不同表格的PersonID集合),那么为什么是'PersonIDsWithThisPostcode .contains(有些人)' 正确的地方 'persons.contains(有些PersonIDsWithThisPostcode)' 不是? 什么是你应该比较收藏哪一种方式的规则? – Glyn

+0

@Glyn集合包含单个项目,而不是列表,所以'myList.Contains(someOtherList)'没有意义。你可以询问'myList'和'someOtherList'是否共享项目,或者如果一个集合完全包含在另一个集合中,但是你需要使用一个量词('Any'或'All'方法对应于'和∀在数学中)。 – dasblinkenlight

+0

那么“myList”是一个集合? 如果你所做的只是返回公共元素,我应该可以互换地使用'myListA.Contains(myListB)'和'myListB.Contains(myListA)'。 人模型是一个集合不是'它? PersonIDsWithThisPostcode是一个集合,因为它是IQueryable不是吗? – Glyn