2010-08-10 74 views
2

我遇到了我的linq查询问题。我正在尝试基于选定的值过滤对象。我们使用一个查询模型返回一个System.Linq.Expressions.Expression并用它来创建一个nhibernate查询。这是我的linq表达。Nhibernate/Linq:NHibernate.QueryException:无法解析属性:Profile.class:MyNamespace.MyObject

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(邮政属性):

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: 索引超出范围。必须为 非负值且小于 的大小。参数名称:索引

当我取出类型比较布尔表达式并只留在引用表达式中时,它仅适用于该一个选项时正常工作。

属性不会被模型以任何方式修改。它们是默认获取/设置的虚拟属性。

任何想法?

回答

3

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

x.Post.Profile.Type = ProfileTypes.BusinessProfile 

在构造函数中的子类只需设置该属性静态,与NHibernate映射它,并为属性映射设置update=false。虽然有点不雅,但这应该会给你你想要的结果。