我有这样的结构
public class ItemBase
{
public int ItemId { get; set; }
public DateTime Created { get; set; }
public ItemType Type { get; set; }
}
public class RockItem : ItemBase { }
public class PlantItem : ItemBase
{
public bool IsDeadly { get; set; }
}
public class AnimalItemBase : ItemBase
{
public int NumberOfLegs { get; set; }
public bool IsDeadly { get; set; }
}
public class DogItem : AnimalItemBase { }
public class CatItem : AnimalItemBase { }
数据库中有一个类型标志,我使用Fluent拆分类型并返回IEnumerable<ItemBase>
这适用于我想要的大部分内容,但现在我处于需要将这些项目融合在一起的情况。例如,我希望在匿名对象中返回ItemId
,IsDeadly
和NumberOfLegs
。结果必须在一个列表中的Created
字段中排序。使用linq有一个简单的方法吗?理想情况下,我不必拆分它们,合并结果,然后排序。
答案 0 :(得分:1)
您提供的示例可以使用OfType
解决:
IEnumerable<ItemBase> items = ...
var results = items.OfType<AnimalItemBase>()
.OrderBy(x => x.Created).ToList();
如果必须支持跨类的属性组合,即所有具有IsDeadly
属性的项,则可以使用反射组合来检查要使用的属性,并dynamic
启用您需要duck typing,因为从技术上讲,这些属性不同IsDeadly
,您只需知道它们在您的方案中应该被视为相同。
这样做可以动态分配匿名类型的属性。即以下示例返回具有IsDeadly
属性的所有类型的结果:
var results = items.OrderBy(x => x.Created)
.Where(x => x.GetType().GetProperty("IsDeadly") !=null)
.Select( x =>
{
dynamic o = x;
return new { IsDeadly = o.IsDeadly, Created = o.Created };
})
.ToList();
同样正如@Henk Holterman指出的那样,只返回匿名类型的枚举才有意义,其中返回类型的每个属性都有意义/为枚举中的 all 定义。< / p>