Ответ 1
Вы должны использовать метод Содержит в своем списке идентификаторов:
var query = from t in db.Table
where idList.Contains(t.Id)
select t;
Я смотрю на google, но не нахожу ничего, что делает трюк для меня.
как вы знаете, SQL имеет предложение where where in in (1,2,3), которое позволяет вам проверять несколько значений. Я использую linq, но я не могу найти синтаксис, который делает то же самое, что и предыдущий оператор.
У меня есть коллекция id категории (List), против которой я хотел бы проверить
Я нашел что-то, что использует метод .contains, но он даже не строит.
Вы должны использовать метод Содержит в своем списке идентификаторов:
var query = from t in db.Table
where idList.Contains(t.Id)
select t;
Синтаксис ниже:
IEnumerable<int> categoryIds = yourListOfIds;
var categories = _dataContext.Categories.Where(c => categoryIds.Contains(c.CategoryId));
Ключевое замечание состоит в том, что вы делаете его в своем списке идентификаторов, а не на объекте, к которому вы применили бы, если бы вы писали sql.
Здесь статья, иллюстрирующая подход. Вы действительно должны использовать метод Contains над своей коллекцией, который будет переведен в предложение IN
.
Вот моя реализация метода 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
var selectedProductsIds = SelectedProducts.Select(p => p.Id).ToList();
// Filtering products
q = q.WhereIn(c => c.Product.Id, selectedProductsIds);