代码之家  ›  专栏  ›  技术社区  ›  Josh

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

  •  2
  • Josh  · 技术社区  · 14 年前

    我的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)如下所示:

    MyObject(后期属性):

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

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

    当我改变的时候 x.Post.Profile is SomeType x.Post.Profile.GetType() == typeof(SomeType) 它抛出一个不同的错误,即

    System.ArgumentOutOfRangeException : 索引超出范围。必须是 非负且小于

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

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

    1 回复  |  直到 11 年前
        1
  •  3
  •   DanP    14 年前

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

    x.Post.Profile.Type = ProfileTypes.BusinessProfile
    

    只需在子类的构造函数中静态设置这个属性,用NHibernate映射它,然后设置 update=false