我有与以下类似的课程:

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));
}

10-06 14:24