コレクションを特定のセットに絞り込むためにさまざまなWhere
andステートメントを使用したクエリ可能なものが 1 つあります。WhereBetween
ここで、一種の a を追加する必要がありWhere || WhereBetween
ます。言い換えれば、今までのようにそれらを連鎖させることはできません。それは And として機能するからです。それで、どうすればこれを行うことができますか?
2 つの可能性があります。
- 私が持っているものから2 つのクエリ可能オブジェクトを作成
Where
します。1 つは を使用し、もう 1 つは を使用しWhereBetween
ます。そして、それらを連結します。これが可能かどうかわかりませんか?また、私の特定のケースではありませんが、おそらく重複してしまうでしょう... - どういうわけか式と で作成された式をある種の Or でマージします。
Where
WhereBetween
最初に述べたように、可能かどうかさえわかりません。もしそうなら、それが良い方法であるかどうかはわかりません。
2 つ目は、オプションとして表示できますが、すべての詳細について完全にはわかりません。以下は、WhereBetween
私の他の質問からの方法です。これは現在使用しており、うまく機能します。
public static IQueryable<TSource> WhereBetween<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
var param = Expression.Parameter(typeof(TSource), "x");
var member = Expression.Invoke(selector, param);
Expression body = null;
foreach (var range in ranges)
{
var filter = Expression.AndAlso(
Expression.GreaterThanOrEqual(member,
Expression.Constant(range.A, typeof(TValue))),
Expression.LessThanOrEqual(member,
Expression.Constant(range.B, typeof(TValue))));
body = body == null ? filter : Expression.OrElse(body, filter);
}
return body == null ? source : source.Where(
Expression.Lambda<Func<TSource, bool>>(body, param));
}
その表現構築部分を新たな手法として抽出できればと考えています。おそらく次のようになります。
public static IQueryable<TSource> WhereBetween<TSource, TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
return source.Where(WhereBetween(selector, ranges));
}
public static Expression<Func<TSource, bool>> WhereBetween<TSource, TValue>(
Expression<Func<TSource, TValue>> selector,
IEnumerable<Range<TValue>> ranges)
{
var param = Expression.Parameter(typeof(TSource), "x");
var member = Expression.Invoke(selector, param);
Expression body = null;
foreach (var range in ranges)
{
var filter = Expression.AndAlso(
Expression.GreaterThanOrEqual(member,
Expression.Constant(range.A, typeof(TValue))),
Expression.LessThanOrEqual(member,
Expression.Constant(range.B, typeof(TValue))));
body = body == null ? filter : Expression.OrElse(body, filter);
}
return body == null
? ø => true
: Expression.Lambda<Func<TSource, bool>>(body, param);
}
次に、その新しいメソッドを使用して、クエリ可能ではなく式を取得できます。WhereBetween(ø => ø.Id, someRange)
たとえば、 andがあるとしましょうø => ø.SomeValue == null
。これらの 2 つを Or と組み合わせるにはどうすればよいですか? 私はメソッドでExpression.OrElse
使用されているを見ていWhereBetween
ます.それが私が必要としているものかもしれませんExpression.Or
. しかし、私はこの式に関して非常に不安定なので、ここで何を選択すればよいか、または正しい軌道に乗っているかどうかさえわかりません:p
誰かがここで私にいくつかの指針を教えてもらえますか?