Я предпочел бы динамически строить пункт Where
используя синтаксис метода и if
с, но если вы хотите вставлять условия внутри запроса, вам необходимо убедиться, что IEnumerable
s, которые вы используете для Contains
критериев не null
. И это должно произойти вне запрос:
var man = model.man ?? Enumerable.Empty<int>();
var size = model.size ?? Enumerable.Empty<int>();
var color = model.color ?? Enumerable.Empty<int>();
PagedData.Products = from p in db.Products
where (from m in p.Manufacturers
where man.Any() && man.Contains(m.ManufacturerID)
select m).Any()
where (from s in p.Sizes
where size.Any() && size.Contains(s.SizeID)
select s).Any()
where (from c in p.Colors
where color.Any() && color.Contains(c.ColorID)
select c).Any()
select p;
Обратите внимание, что filter.Any() && filter.Contains(...)
не имеет смысла и эквивалентно filter.Contans(...)
. Если вы хотите игнорировать пустой фильтр, вы должны использовать !filter.Any() || filter.Contans(...)
.
Так IMO ваш запрос должен быть как этот
var man = model.man ?? Enumerable.Empty<int>();
var size = model.size ?? Enumerable.Empty<int>();
var color = model.color ?? Enumerable.Empty<int>();
PagedData.Products = from p in db.Products
where (from m in p.Manufacturers
where !man.Any() || man.Contains(m.ManufacturerID)
select m).Any()
where (from s in p.Sizes
where !size.Any() || size.Contains(s.SizeID)
select s).Any()
where (from c in p.Colors
where !color.Any() || color.Contains(c.ColorID)
select c).Any()
select p;
или этого
var query = db.Products.AsQueryable();
if (model.man != null && model.man.Length > 0)
query = query.Where(p => p.Manufacturers.Any(m => model.man.Contains(m.ManufacturerID)));
if (model.size != null && model.size.Length > 0)
query = query.Where(p => p.Sizes.Any(s => model.size.Contains(s.SizeID)));
if (model.color != null && model.color.Length > 0)
query = query.Where(p => p.Colors.Any(c => model.color.Contains(c.ColorID)));
PagedData.Products = query;
вы пытались проверить нулевые значения, как 'где model.size! = NULL && model.size.Contains (s.SizeID) ' – esiprogrammer
Массивы могут быть пустыми или целыми числами внутри может быть null? Если это первый случай, просто используйте Список вместо этого и сделайте его по умолчанию пустым –
Можете ли вы изменить int массивы на nullable int list (List)? –