2010-07-19 80 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