让我的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();
但它不会返回任何内容。有关如何从我的收藏中获取人员列表的任何建议吗?
答案 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();