多态LINQ查询

时间:2010-07-19 21:23:53

标签: c# linq

让我的LINQ查询返回我想要使用的对象类型时遇到一些问题。我非常接近,只需要一点点投入。

我有五个表,对象,人物,位置,集合和CollectionEntries。

Object是People,Locations和Collections的基类。 Collection有许多CollectionEntries,可能包含People,Locations和Collections的条目。

给定一个特定的集合,我想编写LINQ查询来检索该集合中的People。

到目前为止,我有这个,它返回一个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 个答案:

答案 0 :(得分: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();

它们都应该与你的例子一起工作。

答案 1 :(得分:2)

试试这个: -

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

您需要先将列表投射到.Object,然后根据类型进行过滤。

答案 2 :(得分:1)

以下是另一种编写方法,即在查询语法中使用let关键字 (那么你可以使用as关键字执行一次投射,这可能会更有效率):

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