我有与以下类似的课程:
public abstract class Base { }
public class Concrete : Base { }
public class Cement : Base { }
和以下代码
var bases = someEntity.Bases; // returns two Concrete and once Cement
// bases now contains:
// - ProxyBase : Base
// - Concrete : Base
// - Cement : Base
var concretes = bases.OfType<Concrete>();
// concretes only contains one Concrete (i.e. the ProxyBase is ignored)
如何在不使用NHibernate知识污染班级的情况下获得两个
Concrete
的预期结果?我也不想强迫映射尽可能不使用延迟加载。
最佳答案
对于动态代理,这绝对是一个痛点。您可以在基类中添加一个Self属性,以便获得对未代理对象的引用:
public virtual Base Self
{
get { return this; }
}
然后,您可以通过检查类型来获取特定类型的具体类:
var concretes = bases.Where(b => b.Self is Concrete);
您还可以创建一个扩展方法,以使OfType的行为符合预期:
public static IEnumerable<T> OfType<T>(this IEnumerable<Base> bases) where T : Base
{
return Enumerable.OfType<T>(bases.Select(b => b.Self));
}