2009-06-10 16 views
32

Şu anda Google'da arama yapmaktayım ancak bana hile yapan hiçbir şey bulamıyorum.LINQ Koleksiyonun İçinde

Bildiğiniz gibi SQL'de "x in (1,2,3)" satırında birden çok değere karşı kontrol etmenizi sağlayan bir deyim vardır. linq kullanıyorum ama yukarıdaki ifadeyle aynı şeyi yapan bir sözdizimi parçası bulamıyorum.

ben .Contains yöntemini kullanan bir şey buldum ama bu bile inşa etmez

kontrol etmek istediğiniz karşı kategori kimliğinin (List) bir koleksiyona sahip.

cevap

40

Sen kimliği listesinde yöntemini içerir kullanmak zorunda kimlikleri - sql yazıyorsanız uyguladığınız nesneyi değil.

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; 
    } 

Ve bu yöntemin çağrı gibi görünür:: hayır

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); 
+0

Yine de bir takipim var. id'in sütun numarası null (değer özelliğini kullanarak unuttum ve çözdüm) Değer boşsa ne olur? –

+1

t.Id değeri boşsa, sonuç bu kaydı içermez. –

3

Yaklaşımı gösteren bir article. Gerçekten de, IN maddesine dönüştürülecek olan koleksiyonunuz üzerinden, Contains yöntemini kullanmalısınız.

IEnumerable<int> categoryIds = yourListOfIds; 

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

nota anahtarı şey listenizde içeren yapmak şudur:

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

bağlantılı makale İşte – MattD

18

sözdizimi aşağıdaki gibidir:

1

() Yöntemi, seçilen birimlerin bir dizi IQueryable koleksiyon filtrelemek için burada benim hayata geçirilmesidir uzun süredir var.