LINQ
を作成します。後でWHERE IN
に翻訳されます。sql
です。私はどうしたら通常の使用の場合:Where with動的プロパティ
(querable
がIQuerable<T>
で、arr
がIEnumerable<int>
ある)
querable = querable.Where(e => arr.Contains(e.Id));
しかし
私の問題は、私は(e.Id
)をフィルタする値が動的であるということです私はそれを文字列として取得します。どうやってやるの?
いくつかのより多くの背景:
filter: {"id": [1,2]}
: の例のようになりますので、私は、彼が値をフィルタしたい列で送信することができ、どのユーザでREST APIエンドポイントをやっていますどのようなものに翻訳したいのですか?queryable.Where(e => new [] {1,2}.Contains(e.Id))
- 私は
queryable.Where(e => new [] {4,5}.Contains(e.CustomerId))
のようなものに変換したい
だから、基本的に私の入力は、私はそれをすることによって達成することができると感じIEnumerable<int>
でstring
とidのリストであるカラム名ですExpression
(this answerに似ています)を使用していますが、どうやってそれを行うのか分かりません。 int型の配列を渡す - 列挙の値の種類を渡すと、これが機能するためにプロパティの型が一致する必要があります(ので、プロパティがint型である場合があること
public static class QueryableExtensions {
public static IQueryable<TEntity> WhereIn<TEntity, TValue>(this IQueryable<TEntity> query, string property, IEnumerable<TValue> values) {
// x
var arg = Expression.Parameter(typeof(TEntity), "x");
// x.Property
var prop = Expression.Property(arg, property);
// values.Contains(x.Property)
var contains = Expression.Call(
typeof(Enumerable),
"Contains",
new[] { typeof(TValue) },
Expression.Constant(values),
prop
);
// x => values.Contains(x.Property)
var lambda = Expression.Lambda<Func<TEntity, bool>>(contains, arg);
return query.Where(lambda);
}
}
注:
[this](https://stackoverflow.com/a/30173701/861716)はあなたが探しているものですが、パラメータ化されたプロパティ名を使用していると思います。 –