2017-07-25 31 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