如何在NHibernate中查询动态属性?

时间:2011-04-05 14:01:13

标签: linq nhibernate dynamic queryover

我有这个问题。 我有一个这样的课:

public class WfStep
{
    private readonly IDictionary properties = new Hashtable();

    public virtual Guid Id { get; private set; }
    public virtual string Name { get; set; }
    public virtual dynamic Properties { get { return new HashtableDynamicObject(properties); } }

及其映射文件如下:

<class name="ConsoleApplication4.WfStep" table="WFSteps">

<id name="Id">
  <generator class="guid"/>
</id>
<property name="Name" />

<map name="Properties" table="WFSteps_Properties" access="field.lowercase">
  <key column="StepId" />
  <index column="PropertyName" type="System.String"/>
  <composite-element class="ConsoleApplication4.ValueItem, ConsoleApplication4">
    <property name="Value" type="System.String"/>
    <property name="ValueType" type="System.String"/>
  </composite-element>
</map>   

此示例移植自: Ayende Support dynamic fields with NHibernate and .NET 4.0

然后我将对象保存到数据库中,如下所示: 即

var step = new WfStep { Name = "John" };
var property = new ValueItem() { Value = DateTime.Now, ValueType = "System.DateTime" };
step.Properties["DateProperty"] = property ;

Session.Save(step);

现在我想返回所有将DateProperty设置为2010年的WFSteps,即:。

var Session.Query<WfStep>().Where(x=>x.Properties.DateProperty.Year == 2010);

它会抛出错误:

  

表达式树可能不包含动态操作

如何查询具有动态属性的此类类。?

1 个答案:

答案 0 :(得分:0)

您可以将映射为地图或列表的集合编入索引。尝试以下hql

from WfStep s
where s.Properties["DateProperty"] = "2010"