2013-04-18 64 views
2

目前,我有以下代碼:將兩步LINQ查詢轉換爲單個LET查詢?

var data = /* enumerable containing rows in your table */; 
var part = "X"; 
var items = new HashSet<int>(data 
    .Where(x => x.PartName == part) 
    .Select(x => x.ItemName)); 
var query = data.Where(x => items.Contains(x.ItemName)); 

items發現與特定PartName數據的所有項目。

query返回該項目的所有數據記錄。

我需要將其轉換爲一個單獨的LET語句(或其他),我可以使用嵌入在另一個更大的LINQ查詢。

例如,如果我的數據如下(記錄):

ItemName PartName 
1  A 
1  B 
2  A 
3  C 

我期待與部分項目「A」我需要的最終結果是:

1  A 
1  B 
2  A 

一個建議是做這樣的事情:

let a = data.GroupBy(x => x.ItemName) 
      .Where(g => g.Any(x => x.Partname == part)) 
      .Select(g => new 
       { 
        ItemName = g.Key, 
        PartNames = g.Select(x => x.PartName) 
       }) 

然而,返回的數據(讓a)不符合預期的重新這返回類似於:

1  A,B // list of parts for that item 
2  A 

而且我需要保持與上面所示相同的預先存在的結構。

任何幫助將不勝感激。

回答

6

聽起來像是你需要從組SelectMany

data.GroupBy(x => x.ItemName) 
      .Where(g => g.Any(x => x.PartName == part)) 
      .SelectMany(g => g); 
+0

1+好的解決方案 – Damith 2013-04-18 04:28:12

0
var data = /* enumerable containing rows in your table */; 
var part = "X"; 
var query = data.Where(x => data 
    .Where(d => d.PartName == part) 
    .Any(d => d.ItemName == x.ItemName)); 
+0

'Contains'!這不會編譯,我認爲你應該使用'Any'。但這不是解決問題的好方法。 – Damith 2013-04-18 04:27:22

+0

然後會是什麼? – JSchwartz 2013-04-18 04:53:41