2013-08-22 11 views
8

私はちょうど動的フィルタを構築したい。 そして最後に、私は(AndAlso)式の組み合わせを使用することを試みたが、それは働いていなかったと最終的に私は良い作品のIQueryableクエリがあることがわかったが、今どのように私は変換することができますIQueryable <T>をExpression <Func <T, bool>>に変換する方法?

Expression<Func<Event, bool>> 

を返しますその戻り値の型へ -

Expression<Func<Event, bool>>? 

マイコード:

public IQueryable<Event> GetBySearch(EventFilter search) 
    { 
     IQueryable<Event> query = this.Context.Events.AsQueryable(); 
     Expression<Func<Event, bool>> expression = null; 

     if (search.CategoryId != 0) 
     { 
      query = query.Where(x => x.CategoryId == search.CategoryId); 
     } 

     if (search.SubCategoryId != 0) 
     { 
      query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
     } 

     expression = query.Expression as Expression<Func<Event, bool>>; //This convert is not working, it returns null. 

     return this.Context.Events.Where(expression); 
    } 
+0

が更新さを見てみましょう答え(フロリシアのコメントを考慮に入れて、あなたはすでにそれを受け入れていると思いますが、あなたはまだそれを知らせるでしょう)。 – Sam

答えて

6

あなただけの次の操作を実行していない任意の理由:

public IQueryable<Event> GetBySearch(EventFilter search) 
{ 
    IQueryable<Event> query = this.Context.Events.AsQueryable(); 

    if (search.CategoryId != 0) 
    { 
     query = query.Where(x => x.CategoryId == search.CategoryId); 
    } 

    if (search.SubCategoryId != 0) 
    { 
     query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
    } 

    return query; 
} 

フロリアンはコメントの中で、IQueryablesを返すことは(可能な場合)避けるべきだと述べました。簡単な解決策ではなく、リストを返すことです:

public List<Event> GetBySearch(EventFilter search) 
{ 
    IQueryable<Event> query = this.Context.Events.AsQueryable(); 

    if (search.CategoryId != 0) 
    { 
     query = query.Where(x => x.CategoryId == search.CategoryId); 
    } 

    if (search.SubCategoryId != 0) 
    { 
     query = query.Where(x => x.SubCategoryId == search.SubCategoryId); 
    } 

    return query.ToList(); 
} 
+0

ああ、それは本当に簡単でした、今、それは動作します、ありがとうございます:) –

+0

これは、予期しない結果をもたらす可能性のあるまだ評価されていないIQueryableをリークします。 'search'のスコープは' GetBySearch'に固定されていないので、 - >悪い練習 – LunicLynx

+1

@FlorianDohrendorfは真です。関数が 'List 'と 'return query.ToList()'を返すようにすると簡単に修正されました。 IQueryableが必要なことを_really_必要としない限り、これは道のりです。私はそれを編集します。 – Sam

2

Whereはこれが有効になりMethodCallExpression

に変換しているため、この変換は有効ではありません。

MethodCallExpression e = query.Expression as MethodCallExpression; 
関連する問題