LINQ Where en cláusula de cobro

He estado buscando en google pero no encontré nada que me ayude.

como saben, SQL tiene una cláusula “donde x en (1,2,3)” que le permite verificar varios valores. Estoy usando linq pero parece que no puedo encontrar una syntax que haga lo mismo que la statement anterior.

Tengo una colección de id de categoría (Lista) contra la que me gustaría verificar

Encontré algo que usa el método .contains pero ni siquiera se construye.

Tienes que usar el método Contains en tu lista de identificación:

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

La syntax es la siguiente:

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

La clave a tener en cuenta es que usted hace los contenidos en su lista de identificadores, no en el objeto que aplicaría si estuviera escribiendo sql.

Aquí hay un artículo que ilustra el enfoque. De hecho, debe utilizar el método Contains sobre su colección, que se traducirá a la cláusula IN .

Aquí está mi realización del Método WhereIn (), para filtrar la colección IQueryable por un conjunto de entidades seleccionadas:

  public static IQueryable WhereIn(this IQueryable source, Expression> memberExpr, IEnumerable 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>(predicate, param)).AsQueryable() : source; } 

Y la llamada de este método se ve así:

 IQueryable q = context.Products.ToList(); var SelectedProducts = new List { 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);