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

时间:2010-08-10 16:55:08

标签: 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
             ||
             (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的虚拟属性。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

x.Post.Profile.Type = ProfileTypes.BusinessProfile

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