LINQ Где в коллекции пункт - PullRequest
32 голосов
/ 10 июня 2009

Я искал в Google, но не нашел ничего, что помогло бы мне.

как вы знаете, в SQL есть предложение "where x in (1,2,3)", которое позволяет проверять множество значений. Я использую linq, но я не могу найти фрагмент синтаксиса, который делает то же самое, что и приведенный выше оператор.

У меня есть коллекция идентификаторов категорий (List), по которым я хотел бы проверить

Я нашел что-то, что использует метод .contains, но даже не создает.

Ответы [ 4 ]

40 голосов
/ 10 июня 2009

Вы должны использовать метод Contains в вашем списке идентификаторов:

var query = from t in db.Table
            where idList.Contains(t.Id)
            select t;
19 голосов
/ 10 июня 2009

Синтаксис ниже:

IEnumerable<int> categoryIds = yourListOfIds;

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

Ключевым моментом, на который следует обратить внимание, является то, что вы делаете содержимое в своем списке идентификаторов, а не на объекте, к которому вы бы применили, если бы писали sql.

3 голосов
/ 10 июня 2009

Вот статья , иллюстрирующая подход. Вы действительно должны использовать метод Contains над своей коллекцией, который будет переведен в предложение IN.

1 голос
/ 07 ноября 2014

Вот моя реализация метода WhereIn () для фильтрации коллекции IQueryable по набору выбранных объектов:

 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...