【发布时间】:2015-11-19 02:53:51
【问题描述】:
我想在我的 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 的建议删除了 working-as-wanted 代码,并留下了我想要修复的代码。
已解决
由于结合了@jason 和@Marlon 的答案,我修复了它。我会将解决方案放在单独的答案中。我只想了解2点:
- 为什么只有当我基于 Product 进行查询时它才能正常工作?
- 为什么`.Distinct()`没有做任何事情,我得到了重复的产品。
【问题讨论】:
-
您可能应该查看谓词 (stackoverflow.com/a/1710395/3951051) 并将它们链接起来。 (stackoverflow.com/questions/1248232/combine-multiple-predicates)
-
如果您将代码缩减为您遇到问题的实际 lambda(部分),并包含一些最少的设置代码来重现问题,这将有所帮助。目前,我觉得有很多代码位分散了您遇到的实际问题。
-
我猜你过滤结果不是通过调用 Any(),而是在这里:Grouped.FirstOrDefault()。顺便说一句,您可以使用谓词直接调用 Any 而不使用 Where 子句: Any(a => a.ColorID == IntColorId)
-
@FireAlkazar 此代码丢弃重复的结果
GroupBy(x => x.ProductID).Select(Grouped => Grouped.FirstOrDefault())、Size和Price Range,它返回所有结果而不重复。感谢.Any()部分。