2017-12-13 23 views
4

LINQを作成します。後でWHERE INに翻訳されます。sqlです。私はどうしたら通常の使用の場合:Where with動的プロパティ

querableIQuerable<T>で、arrIEnumerable<int>ある)

querable = querable.Where(e => arr.Contains(e.Id)); 

しかし

私の問題は、私は(e.Id)をフィルタする値が動的であるということです私はそれを文字列として取得します。どうやってやるの?

いくつかのより多くの背景

  1. filter: {"id": [1,2]}

: の例のようになりますので、私は、彼が値をフィルタしたい列で送信することができ、どのユーザでREST APIエンドポイントをやっていますどのようなものに翻訳したいのですか?queryable.Where(e => new [] {1,2}.Contains(e.Id))

  1. 私はqueryable.Where(e => new [] {4,5}.Contains(e.CustomerId))

    のようなものに変換したい

だから、基本的に私の入力は、私はそれをすることによって達成することができると感じIEnumerable<int>

stringとidのリストであるカラム名ですExpressionthis 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); 
    } 
} 

注:

+0

[this](https://stackoverflow.com/a/30173701/861716)はあなたが探しているものですが、パラメータ化されたプロパティ名を使用していると思います。 –

答えて

2

あなたはこのようにそれを行うことができます)。

+0

完璧!どうもありがとう –