私は、IQueryableにwhere述語として適用するDateRangeクラスを用意しています。開始日と終了日を自動的に使用し、自動的に開かれた間隔または閉じた間隔を使用します。1つの式を別の式に含めるにはどうすればよいですか?
public class DateRange
{
public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; }
public bool BeginInclusive { get; set; }
public bool EndInclusive { get; set; }
public DateRange()
{
BeginInclusive = true;
EndInclusive = false;
}
public IQueryable<T> Apply<T>(IQueryable<T> source, Expression<Func<T,DateTime>> dateField)
{
var result = source;
if (BeginDate.HasValue)
{
if (BeginInclusive)
result = result.Where(x => dateField >= BeginDate); //does not compile
else
result = result.Where(x => dateField > BeginDate); //does not compile
}
if (EndDate.HasValue)
{
if (EndInclusive)
result = result.Where(x => dateField <= EndDate); //does not compile
else
result = result.Where(x => dateField < EndDate); //does not compile
}
return result;
}
}
そして、私はこのようにそれを呼びたい、DateFieldには、だから私は適用法にメンバー式を渡したい、それが適切に適用する必要がありT.
DateRange d;
IQueryable<T> q;
q = d.Apply(q, x => x.DateField);
の任意の日付と時刻のプロパティですWhere句を結果セットに追加しますが、に埋め込まれたdateFieldメンバー式を取得する方法を理解できません。ここで、述語の式です。上のクラスで "コンパイルしない"行を参照してください。私は何とかdateFieldを変換するか、または他の方法で述語式を構築する必要がありますが、どうやってそれを行うのか分かりません。
あなたは 'のDateField> = BeginDate'' Expression'クラスのメソッドを使用して、工芸品を手にする必要があります:
これは、あなたのコードを書くことができます。 – MarcinJuraszek
私はそれを行う方法がわかりません。 Expressionクラスそのものはあまり働かない。私はLinqKitのPredicateBuilderを使用しましたが、この状況ではあまり役に立ちません。最後の 'where'述語はLinq-to-Entitiesでも機能する必要があります。 – Triynko
これはどのように見えますか: 'var expr = Expression.GreaterThanOrEqual(dateField.Body、Expression.Constant(BeginDate)); result = result.Where(Expression.Lambda>(expr)); ' –
Triynko