2010-07-19 133 views
1

讓我的LINQ查詢返回我想要處理的對象類型有一點問題。我非常接近,只需要一點點的輸入。多態LINQ查詢

我有五個表,對象,人員,位置,集合和收集條目。

對象是人員,位置和集合的基類。一個Collection包含許多CollectionEntries,它們可能包含People,Locations和Collections的條目。

給定一個特定的集合,我想編寫LINQ查詢來檢索該集合中的人員。

到目前爲止,我有這個,它返回一個CollectionEntries列表(它們對應於People條目,yay的一半!),但我寧願讓它返回People的實例。

var people = collection.CollectionEntries.Where( 
    entry => entry.Object is Person).ToList(); 

我也試着這樣做:

var people = collection.CollectionEntries.Where( 
    entry => entry.Object is Person).OfType<Person>().ToList(); 

但它不會返回任何東西。有關如何從我的收藏中獲取人物列表的任何建議?

回答

3

嘗試:

var people = collection.CollectionEntries.Where(entry => entry.Object is Person) 
             .Select(entry => (Person)entry.Object) 
             .ToList(); 

var people = collection.CollectionEntries.Where(entry => entry.Object is Person) 
             .Select(entry => entry.Object) 
             .Cast<Person>() 
             .ToList(); 

他們應該與你的例子都工作。

+0

端使用select方法,但必須使用entry.Object而不是僅僅輸入。感謝您的及時響應! – Matthew 2010-07-19 21:40:17

+0

哎呀是愚蠢的我,我已經糾正了現在的答案。順便說一句,你可以使用反引號'在評論中包裝代碼片段 – 2010-07-19 21:45:41

2

試試這個: -

var people = collection.CollectionEntries.Select(entry => entry.Object).OfType<Person>().ToList(); 

您需要的項目列表中去的.Object第一,然後篩選根據類型。

1

下面是寫這個的另一種方法是使用查詢語法內let關鍵字
(那麼你可以只執行一個鑄造用as關鍵字,這可能是更有效):

var people = 
    (from e in collection.CollectionEntries 
    let pers = entry.Object as Person 
    where pers != null select pers).ToList(); 
+0

非常漂亮!我喜歡! – Matthew 2010-07-19 22:01:57