2009-06-10 11 views
32

私はGoogleで探していたが、私のためのトリックを見つけるものを見つけていない。LINQどこにコレクションの句

あなたが知っているように、SQLには、複数の値をチェックできる "where in x(1,2,3)"節があります。 私はlinqを使用していますが、私は上記の文と同じような構文を見つけることはできません。

私は.containsメソッドを使用して何かを見つけたが、それもビルドしていない私は

をチェックしたいと思い、それに対してカテゴリIDの(一覧)のコレクションを持っています。

答えて

40

あなたのIDリストにContainsメソッドを使用する必要があります。

var query = from t in db.Table 
      where idList.Contains(t.Id) 
      select t; 
+0

私は1つのフォローアップを持っています。 IDの列がNULL可能です(これは値プロパティを使用して忘れてしまっていました) 値がnullの場合はどうなりますか? –

+1

t.Idの値がnullの場合、resultにはこのレコードは含まれません。 –

3

ここには、アプローチを示すarticleがあります。コレクションの上にContainsメソッドを実際に使用し、IN節に変換する必要があります。

+5

リンク先の記事ここ – MattD

18

構文は以下の通りです:

IEnumerable<int> categoryIds = yourListOfIds; 

var categories = _dataContext.Categories.Where(c => categoryIds.Contains(c.CategoryId)); 

注意すべき重要なことは、あなたがあなたのリストに含まれていないということですがids - あなたがSQLを書いていた場合にinを適用するオブジェクトではありません。

public static IQueryable<T> WhereIn<T,TProp>(this IQueryable<T> source, Expression<Func<T,TProp>> memberExpr, IEnumerable<TProp> values) where T : class 
    { 
     Expression predicate = null; 
     ParameterExpression param = Expression.Parameter(typeof(T), "t"); 

     bool IsFirst = true; 

     MemberExpression me = (MemberExpression) memberExpr.Body; 
     foreach (TProp val in values) 
     { 
      ConstantExpression ce = Expression.Constant(val); 


      Expression comparison = Expression.Equal(me, ce); 

      if (IsFirst) 
      { 
       predicate = comparison; 
       IsFirst = false; 
      } 
      else 
      { 
       predicate = Expression.Or(predicate, comparison); 
      } 
     } 

     return predicate != null 
      ? source.Where(Expression.Lambda<Func<T, bool>>(predicate, param)).AsQueryable<T>() 
      : source; 
    } 

そして、このメソッドの呼び出しは次のようになります:いいえ

IQueryable<Product> q = context.Products.ToList(); 

var SelectedProducts = new List<Product> 
{ 
    new Product{Id=23}, 
    new Product{Id=56} 
}; 
... 
// Collecting set of product id's  
var selectedProductsIds = SelectedProducts.Select(p => p.Id).ToList(); 

// Filtering products 
q = q.WhereIn(c => c.Product.Id, selectedProductsIds); 
1

は()メソッドは、選択したエンティティのセットでのIQueryableコレクションをフィルタリングするにはここの私の実現でありますもっと長い。
関連する問題