使用ActiveRecord,NHibernate,DetachedCriteria过滤对象

时间:2011-06-14 11:41:28

标签: c# nhibernate activerecord filter detachedcriteria

C#3.0,Nhibernate 2.1.2,Castle ActiveRecord 2.1,WinXP 32

我在使用ActiveRecord和DetachedCriteria过滤元素时遇到问题。 有两个表,一个包含要过滤的对象(PropertyContainer),另一个包含为此对象设置的dymamic属性值(PropertyValue)。

PropertyContainer
 Id int

PropertyValue
 Id             int
 ContainerId    int
 Value          real

我需要选择PropertyContainer对象,其中PropertyValue表中的值与某些条件匹配(例如,Id = 1且Value> 2的属性)。我想使用DetachedCriteria这样做,我试着写这样的东西:

var detachedCriteria = DetachedCriteria.For(typeof(PropertyContainer));

detachedCriteria.SetProjection(
    Projections.SqlProjection(@"select Value from PropertyValue where Id=1"),
    new[] { "ExternalProperty" }, 
    new[] { NHibernateUtil.Double }));  

detachedCriteria.Add(Expression.Ge("ExternalProperty",2));

var filteredItems = PropertyContainer.SlicedFindAll(0,100,detachedCriteria);

然后执行此调用我收到以下错误: “无法解析属性:PropertyProtainer的ExternalProperty”

问题是:

  1. 这种方法有什么问题?
  2. 使用ActiveRecord / NHibernate和DetachedCriteria通过动态属性集进行过滤的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

如果PropertyValue看起来像:

class PropertyValue
{
    public virtual int Id { get; set; }
    public virtual double Value { get; set; }
}

你可以这样做:

DetachedCriteria.For<PropertyContainer>()
    .CreateAlias("PropertyValues", "prop")
    .Add(Restrictions.Ge("prop.Value", 2))
    .Add(Restrictions.Eq("prop.Id", 1));