我有以下自定义类型,上面有一个方法来确定一个时间跨度是否与另一个时间重叠
public struct DateTimeSpan
{
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
public bool Overlaps(DateTimeSpan overlap)
{
//....
}
}
我正在尝试编写一个自定义 HQL 生成器,以便在我的数据访问 LINQ 查询中使用此方法时,它会在查询数据库时生成适当的 SQL。
这是我BaseHqlGeneratorForMethod
尝试将一个与另一个的End
属性进行比较的开始DateTimeSpan
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());
}
}
我已经证明正在评估中的End
财产,targetObject
但无论我做什么,我都无法得到它来评估End
财产arguments[0]
。上面的代码只是我尝试过的一个例子(并且似乎是最明显的,因为它适用于targetObject
),我尝试的大多数事情都以异常结束Antlr.Runtime.NoViableAltException
targetObject
和之间的一个明显区别arguments[0]
是它targetObject
是类型PropertyExpression
和arguments[0]
是类型ConstantExpression
。我认为这意味着需要有不同的方法来访问它们,但我无法弄清楚它是什么!