2009-12-03 177 views
1

我有一個返回一組實體的第一查詢:如何編寫這個linq查詢?

這組內的實體組織成鏈

var resultSet = ....query....ToList(); 

這將返回A,B,C,d,E,因爲他們有一個參考(prevEntityId)指向相同類型的實體,即:

A - >乙 - > d

ç - >電子

我想編寫第二個查詢,以便只返回A和C,但我不知道如何編寫它。

我寧願你用linq方法(比如.Where())而不是新的linq語法來回答。

謝謝

更新:對不起,我最初使用了錯誤的詞彙在我與術語「外鍵」的問題。實際上,一個實體直接引用前一個實體,以便在第二個查詢中選擇一個實體,但不得有其他實體引用它。我認爲這將需要2個查詢,但如果你認爲它可以在一個...

+0

Nicolas;也許你可以用類定義來更新你的問題,或者可能是一些示例數據? – 2009-12-03 20:56:23

+0

我已根據此更改更新了我的答案。請看現在是否正確。 – 2009-12-03 21:21:31

回答

1

編輯:好的,因爲關係是我期望的相反,你要找的實體,沒有實體,有它的前一個。

一個選擇:現在

Where(x => !fullList.Any(y => y.PrevEntityId == x.Id)); 

,如果您的查詢實際上是被在SQL執行這將是值得看的是什麼生成 - 它很可能是沒有效率。它非常明確將不會在LINQ to Objects中高效。對於LINQ到對象,你會用更好:

HashSet<string> prevIds = new HashSet<string>(fullList.Select(x => x.PrevId)); 
var heads = fullList.Where(x => !prevIds.Contains(x)); 

如果你能對你的環境的詳細信息,這將幫助我們來幫助你。

+0

對不起,我錯誤地描述了我的問題。查看更新。你的答案會產生D和E. – 2009-12-03 20:24:16

+0

我不在可測試的環境中,所以我不能馬上測試你的解決方案,但至少在理論上你的第二個解決方案能滿足我。只要我能用我的數據來證明它,我會接受你的答案。 – 2009-12-03 21:37:24

0

我不是100%清楚你的實體和他們的關係,但這會讓你開始。

這聽起來像你現在試圖從你的resultSet對象進一步查詢。如果想要A和C,那麼它聽起來像FK將是空的。

var cEntities = resultSet.Where(e=>e.prevEntityID == null).ToList(); 
+0

對不起,我錯誤地描述了我的問題。查看更新。你的答案會產生D和E. – 2009-12-03 20:23:29

0

您可以編寫一個幫助函數,給定鏈中的最後一個實體爲您提供第一個實體。然後你可以將它與pcampbell的答案結合起來,以獲得鏈中的第一個實體。東西沿着這些線

resultSet.Where(e=>e.prevEntityID == null).Select(e => GetHead(e, resultSet)).ToList(); 

Entity GetHead(Entity current, List<Entity> entities) 
{ 
    Entity next = entities.Where(e => e.prevEntityID = current.id).FirstOrDefault(); 

    if (next == null) 
     return current; 
    else 
     return GetHead(next, entities); 
} 
+0

我明白這可能有效,但我想避免這樣的解決方案,並認爲可能存在實現相同的事情的查詢。 – 2009-12-03 21:04:18