C# Nhibernate/Linq:Nhibernate.QueryException:无法解析属性:Profile.class of:MyNamespace.MyObject

C# Nhibernate/Linq:Nhibernate.QueryException:无法解析属性:Profile.class of:MyNamespace.MyObject,c#,linq,nhibernate,fluent-nhibernate,C#,Linq,Nhibernate,Fluent Nhibernate,我的linq查询有问题。我正在尝试根据选定的值筛选对象。我们使用一个查询模型返回System.Linq.Expressions.Expression,并使用它创建一个nhibernate查询。这是我的linq表达式 x =>(request.InitialLoad || (!request.InitialLoad && (Enum.GetValues(typeof(MyType)).Length == request.MyTypes.Length

我的linq查询有问题。我正在尝试根据选定的值筛选对象。我们使用一个查询模型返回System.Linq.Expressions.Expression,并使用它创建一个nhibernate查询。这是我的linq表达式

x =>(request.InitialLoad
     || (!request.InitialLoad
         && (Enum.GetValues(typeof(MyType)).Length == request.MyTypes.Length
             ||
             (Enum.GetValues(typeof(MyType)).Length != request.MyTypes.Length
              &&
              ((request.MyTypes.Contains((int)MyType.Referrals)
                && x.Post.PostType == StatusPostType.Referral)
               ||
               (request.MyTypes.Contains((int)MyType.Businesses)
                && x.Post.Profile is BusinessProfile)
               ||
               (request.MyTypes.Contains((int)MyType.Members) 
                && x.Post.Profile is UserProfile)
              )
             )
            )
        )
    )
    && x.Profile.Equals(request.Profile);
映射(我们使用的是fluent)如下所示:

x.Post.Profile.Type = ProfileTypes.BusinessProfile
MyObject(后期属性):

MyObject.Post(配置文件属性):

当我将
x.Post.Profile是SomeType
更改为
x.Post.Profile.GetType()==typeof(SomeType)
时,它会抛出一个不同的错误,即

System.ArgumentOutOfRange异常: 索引超出范围。必须是 非负数且小于 收藏。参数名称:索引

当我取出类型比较布尔表达式并只保留在Referrals表达式中时,只对这一个选项进行过滤就可以了

模型不会以任何方式修改特性。它们是具有默认get/set的虚拟属性


有什么想法吗?

我很确定NHibernate.Linq不支持直接对类类型进行过滤。如果需要区分这些类型,我将在基类(可能是枚举)上使用一个属性值,该属性值在子类中设置为正确的值。然后,您可以这样执行比较:

x.Post.Profile.Type = ProfileTypes.BusinessProfile
只需在子类的构造函数中静态设置此属性,将其映射到NHibernate,并为属性映射设置
update=false
。虽然有点不雅观,但这会给你带来你想要的结果

x.Post.Profile.Type = ProfileTypes.BusinessProfile