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

我的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); 

映射(我们使用流利)看起来像这样:

MyObject(Post属性):

 References(x => x.Post, "PostId"); 

MyObject.Post(Profile属性):

 References(x => x.Profile, "ProfileId"); 

当我将x.Post.Profile is SomeType更改x.Post.Profile is SomeTypex.Post.Profile.GetType() == typeof(SomeType)它会抛出不同的错误,这是

System.ArgumentOutOfRangeException:索引超出范围。 必须是非负数且小于集合的大小。 参数名称:index

当我取出类型比较布尔表达式并且只留在引用表达式中时,它适用于仅对该一个选项进行过滤。

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

有任何想法吗?

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

 x.Post.Profile.Type = ProfileTypes.BusinessProfile 

只需在子类的构造函数中静态设置此属性,使用NHibernate映射它,并为属性映射设置update=false 。 虽然有点不优雅,但这应该可以为您提供所需的结果。