當訪問參數的屬性我有它的方法下面的自定義類型,以確定一個時間跨度重疊的另一如何編寫自定義的NHibernate HQL發電機
public struct DateTimeSpan
{
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
public bool Overlaps(DateTimeSpan overlap)
{
//....
}
}
我試圖寫一個自定義HQL發生器所以當我在我的數據訪問LINQ查詢中使用這個方法時,它將在查詢數據庫時生成適當的SQL。
這是我BaseHqlGeneratorForMethod
的試圖的一個DateTimeSpan
的End
屬性與其他
public class DateSpanOverlapsDateTimeSpanHqlGenerator : BaseHqlGeneratorForMethod
{
public DateSpanOverlapsDateTimeSpanHqlGenerator()
{
SupportedMethods = new[]
{
ReflectionHelper.GetMethodDefinition<DateTimeSpan>(x => x.Overlaps(new DateTimeSpan()))
};
}
public override HqlTreeNode BuildHql(MethodInfo method, Expression targetObject, ReadOnlyCollection<Expression> arguments, HqlTreeBuilder builder, IHqlExpressionVisitor visitor)
{
var endTargetProperty = ReflectionHelper.GetProperty<DateTimeSpan, DateTime?>(x => x.End);
Expression endTargetExpression = Expression.MakeMemberAccess(targetObject, endTargetProperty);
var endArgumentProperty = ReflectionHelper.GetProperty<DateTimeSpan, DateTime?>(x => x.End);
Expression endArgumentExpression = Expression.MakeMemberAccess(arguments[0], endArgumentProperty);
return builder.GreaterThanOrEqual(visitor.Visit(endTargetExpression).AsExpression(), visitor.Visit(endArgumentExpression).AsExpression());
}
}
我已經證明,在targetObject
的End
屬性被評價不錯,但不管比較開始了我我是否無法通過arguments[0]
來評估End
財產。上面的代碼只是其中的一個我曾嘗試例子(似乎是最明顯的給出它的工作原理爲targetObject
)與大多數的事情,我嘗試用異常targetObject
和arguments[0]
之間
一個明顯的不同碰得是targetObject
是PropertyExpression
和arguments[0]
類型是ConstantExpression
。我認爲這意味着需要有不同的方法來訪問它們,但我無法弄清它是什麼!