C# Nhibernate/Linq:Nhibernate.QueryException:无法解析属性:Profile.class of:MyNamespace.MyObject
我的linq查询有问题。我正在尝试根据选定的值筛选对象。我们使用一个查询模型返回System.Linq.Expressions.Expression,并使用它创建一个nhibernate查询。这是我的linq表达式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
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