linq - 根据对象类型检索数据

时间:2011-03-02 17:07:27

标签: c# linq

我有这样的结构

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>

这适用于我想要的大部分内容,但现在我处于需要将这些项目融合在一起的情况。例如,我希望在匿名对象中返回ItemIdIsDeadlyNumberOfLegs。结果必须在一个列表中的Created字段中排序。使用linq有一个简单的方法吗?理想情况下,我不必拆分它们,合并结果,然后排序。

1 个答案:

答案 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>

相关问题