ある期間が別の期間と重複するかどうかを判断するためのメソッドを含む次のカスタムタイプがあります
public struct DateTimeSpan
{
public DateTime? Start { get; set; }
public DateTime? End { get; set; }
public bool Overlaps(DateTimeSpan overlap)
{
//....
}
}
カスタムHQLジェネレーターを作成しようとしています。これにより、データアクセスLINQクエリ内でこのメソッドを使用すると、データベースのクエリ時に適切なSQLが生成されます。
これは、一方のプロパティをもう一方のプロパティと比較しようとする私の始まりBaseHqlGeneratorForMethodですEndDateTimeSpan
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です。これは、それらにアクセスするためのさまざまな方法が必要であることを意味すると思いますが、それが何であるかを理解することはできません!