繁体   English   中英

使用Lambda Expression进行高级搜索

[英]Advanced Search using Lambda Expression

我想在我的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();

我在ProductColor表之间有多对多关系,而ProductColor是链接它们的关系。 ProductProductSizeSize tables也是如此。

代码与SizePrice Range完美配合。 Color的问题,因为.Any()在找到第一个Product时返回。 如果有多个Product ,则只返回第一个产品。

所以,我想知道是否有其他方法或其他方法可以获得具有指定颜色的所有产品。

我搜索了很多,并且知道我可以动态地构建Where子句,但我认为这对我的要求来说太过分了。 如果有一个简单的解决方案,我会非常高兴。

编辑

我删除了@Jeroen建议的按需工作代码,并留下了我想修复的代码。

解决了

由于结合了@jason和@Marlon的答案,我修好了它。 我将把解决方案放在一个单独的答案中。 我只想了解2点:

  • 为什么只有在我对产品进行查询时才能正常工作?
  • 为什么`.Distinct()`没有做任何事情,我得到了重复的产品。

请试试这个。 它使用IQueryable让您在调用ToList时对数据库执行之前更容易构造条件。

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();

尝试将您的查询基于Product而不是ProductSize :(您没有说,所以我假设Size和Price在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的方法,而不是将所有内容放在一个查询中,因为在最后一个查询中间的'或'会忽略数据库中的任何索引。

这对我有用

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM