我想在我的ASP.NET MVC应用程序中实现高级搜索,用户可以在其中为产品搜索选择一个或多个条件。
我们说我有这些标准:颜色,尺寸,价格范围。
到目前为止,这是
ProductSizeList = db.ProductSizes.Where(ProductSize =>
(string.IsNullOrEmpty(ProductColorId) || ProductSize.Product.ProductColors.Where(a => a.ColorID == IntColorId).Any())
).GroupBy(x => x.ProductID).Select(Grouped => Grouped.FirstOrDefault()).ToList();
我在Product
和Color
表之间存在多对多关系,ProductColor
是链接它们的关系。与Product
,ProductSize
,Size
表相同。
代码与Size
和Price Range
完美配合。问题Color
,因为.Any()
在找到第一个Product
时返回。如果有多个Product
,则只返回第一个。
所以,我想知道是否有其他方法,或者能够获得具有指定颜色的所有产品的其他方式。
我搜索了很多,并且知道我可以动态地构建Where子句,但我认为这对我的要求来说太过分了。如果有一个简单的解决方法,我会非常高兴。
修改
我删除了@jeroen建议的按需工作代码,并留下了我想修复的代码。
解决
我修复了它,感谢@jason和@Marlon的答案。我将解决方案放在一个单独的答案中。我只想了解2点:
答案 0 :(得分:4)
请试试这个。在调用ToList
时,它使用IQueryable让您在对数据库执行之前更轻松地构建条件。
var query = db.ProductSizes.AsQueryable();
if (string.IsNullOrEmpty(ProductColorId) == false)
query = query.Where(ProductSize => ProductSize.Product.ProductColors.Any(a => a.ColorID == IntColorId))
if (string.IsNullOrEmpty(SizeId) == false)
query = query.Where(ProductSize => ProductSize.Size.Id == IntSizeId);
if (string.IsNullOrEmpty(From) == false)
query = query.Where(ProductSize => ProductSize.Price >= DecimalFrom);
if (string.IsNullOrEmpty(To) == false)
query = query.Where(ProductSize => ProductSize.Price <= DecimalTo);
var ProductSizeList = query
.Select(ProductSize => ProductSize.ProductID)
.Distinct()
.ToList();
答案 1 :(得分:1)
尝试将您的查询基于Product而不是ProductSize :(您没有说,所以我假设尺寸和价格在ProductSize对象中)。
var query = db.Product.AsQueryable();
if (string.IsNullOrEmpty(ProductColorId) == false)
query = query.Where(product => product.ProductColors.Where(a => a.ColorID == IntColorId).Any());
if (string.IsNullOrEmpty(SizeId) == false)
query = query.Where(product => product.Sizes.Where(s => s.Size_Id == IntSizeId));
(...)
var ProductSizeList = query
.Select(product => product.ProductID)
.Distinct()
.ToList();
我优先采用Jason W的方法,而不是将所有内容都放在一个查询中,因为在最后一个&#39;或者&#39;在查询中间将忽略数据库中的任何索引。
答案 2 :(得分:0)
这对我有用
var query = db.Products.AsQueryable();
if (string.IsNullOrEmpty(ProductColorId) == false)
query = query.Where(Product => Product.ProductColors.Any(a => a.ColorID == IntColorId));
if (string.IsNullOrEmpty(SizeId) == false)
query = query.Where(Product => Product.ProductSizes.Any(a => a.SizeID == IntSizeId));
if (string.IsNullOrEmpty(From) == false)
query = query.Where(Product => Product.ProductSizes.Any(a => a.Price >= DecimalFrom));
if (string.IsNullOrEmpty(To) == false)
query = query.Where(Product => Product.ProductSizes.Any(a => a.Price <= DecimalTo));
var ProductsList = query
.Select(ProductSize => ProductSize)
.GroupBy(x => x.id).Select(Grouped => Grouped.FirstOrDefault())
.ToList();
我的查询基于Product
,并使用GroupBy
删除重复的结果,而不是Distinct
。