我的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 property):
References(x => x.Post, "PostId");
MyObject.Post(个人资料属性):
References(x => x.Profile, "ProfileId");
当我将x.Post.Profile is SomeType
更改为x.Post.Profile.GetType() == typeof(SomeType)
时,会抛出不同的错误,即
System.ArgumentOutOfRangeException: 指数超出范围。一定是 非负和小于的大小 集合。参数名称:index
当我取出类型比较布尔表达式并且只留在引用表达式中时,它只适用于过滤那个选项。
模型不会以任何方式修改属性。它们是具有默认get / set的虚拟属性。
有什么想法吗?
答案 0 :(得分:3)
我很确定NHibernate.Linq不支持直接对类类型进行过滤。如果你需要区分类型,我会在基类(可能是枚举)上使用属性值,该属性值设置为子类中的正确值。然后,您可以执行以下比较:
x.Post.Profile.Type = ProfileTypes.BusinessProfile
只需在子类的构造函数中静态设置此属性,使用NHibernate映射它,并为属性映射设置update=false
。虽然有点不优雅,但这应该可以为您提供所需的结果。