ある期間が別の期間と重複するかどうかを判断するためのメソッドを含む次のカスタムタイプがあります
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
との明らかな違いの1つarguments[0]
はtargetObject
、タイプPropertyExpression
とarguments[0]
タイプConstantExpression
です。これは、それらにアクセスするためのさまざまな方法が必要であることを意味すると思いますが、それが何であるかを理解することはできません!