2011-01-20 38 views
3

在下面的LINQ查詢中,我想返回在Contractors表中找到的ContractorId。並非聯繫人表中的所有人都在承包商表中。我真正想要的是那些滿足標準的承包商的ContractorIds列表。 ContractorId與ContactId不同。如何使用多個.Select()來簡化LINQ查詢以返回IQueryable(int)

var contractorsWithCertsFor2010 = dc.Contacts.Where(x => x.Contractors 
.Any(d => d.ContractorStatus 
.Any(date => date.StatusDate.Year >= 2010))) 
.Select(x => x.Contractors 
.Select(dr => dr.ContractorId)); 

IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010); 

allPeople是IQueryable<Int>但contractorsWithCertsFor2010是一個IQueryable<IEnumerable<Int>>.東西是不正確那裏。多重。選擇()是造成IQueryable<IEnumerable<Int>>所以我在尋找一種方法來消除。選擇(之一),並獲得

IQueryable<Int> 

任何建議一回?謝謝!

解決方案: 一種解決方案張貼在下面的答覆。我在看到那個之前創建了另一個解決方案。在我的解決方案中,我開始在Contractors表中而不是Contacts表中刪除一個圖層和一個.Select()語句。

回答

4

假設你只希望有聯繫人記錄。既然你選擇的唯一事情是承包商ID,你可能想試試這個承包商:

var contractorsWithCertsFor2010 = dc.Contractors 
    .Where(c => c.Contacts.Any() && c.ContractorStatus 
     .Any(cs => cs.StatusDate.Year >= 2010)) 
    .Select(c => c.ContractorId); 
+0

這就是我目前使用的。我過度思考一個相當簡單的解決方案。 – DenaliHardtail 2011-01-20 17:48:10

3

首先想到:試試SelectMany來平整你的結果。因此,除了相同的代碼:

//... 
.SelectMany(x => x.Contractors 
        .Select(dr => dr.ContractorId)); 

IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010); 
+0

.SelectMany工作得很好,我只是測試它。在看到你的文章之前,我回過頭重寫了這個查詢。我現在有兩個工作解決方案。再次,我過度考慮解決方案,並且多個.Select()不是必需的。謝謝! – DenaliHardtail 2011-01-20 17:42:59