动态位置在linq中,具有运行asp.net mvc的列表参数

时间:2018-06-22 07:50:36

标签: c# asp.net-mvc linq

我正在屏幕上显示产品列表,但是当用户单击不同的复选框时,我在action参数中得到了checked复选框的值。这是我的屏幕。

Product Screen

现在我要在不同的项目选择上动态请求查询。

   public async Task<IEnumerable<Product>> GetSpecificProducts
        (List<int> brands, List<int> categories, List<int> sugar)
    {
        var products = await _context.Products
            .Where(x => x.BrandId == ???)
            .Where(x => x.CategoryId == ???)
            .Where(x => x.Sugar == ???)
            .ToListAsync();
    }`

我已经看过一些stackoverflow问题,但是在here这样的单一值的情况下,我只是得到结果。如何在多个where子句上生成动态linq。

2 个答案:

答案 0 :(得分:3)

您只需要检查每个集合是否为空,然后将其作为查询的过滤器,如下所示:

public async Task<IEnumerable<Product>> GetSpecificProducts 
     (List<int> brands, List<int> categories, bool? sugar)
{
    IQueryable<Product> query = _context.Products;

    if(brands != null && brands.Any()) 
        query = query.Where(x => brands.Contains(x.BrandId));

    if(categories != null && categories.Any()) 
        query = query.Where(x => categories.Contains(x.CategoryId));

    if(sugar.HasValue) 
        query = query.Where(x => x.Sugar == sugar);

    var products = await query.ToListAsync();
}

答案 1 :(得分:0)

当您想要Product在品牌列表中brandId的列表,categoryId在类别列表中并且sugar在糖列表中时, 你可以做到的。

public async Task<IEnumerable<Product>> GetSpecificProducts
    (List<int> brands, List<int> categories, List<int> sugar)
{
    var products = await _context.Products
        .Where(x => brands.Contains(x.BrandId) &&
                    categories.Contains(x.CategoryId) &&
                    sugar.Contains(x.Sugar))
        .ToListAsync();
}

----------更新----------

正如您所提到的,糖是数据库中的bool属性,并且已经建议您更改方法的签名。

还更新我的代码以检查列表是否为空,如果列表为空,则意味着用户尚未选择任何过滤器,因此我们将在过滤时忽略该条件。

public async Task<IEnumerable<Product>> GetSpecificProducts
    (List<int> brands, List<int> categories, bool? sugar)
{
    var products = await _context.Products
        .Where(x => (brands.Any() ? brands.Contains(x.BrandId) : true) &&
                    (categories.Any() ? categories.Contains(x.CategoryId) : true) &&
                    (sugar.HasValue ? sugar == x.Sugar : true))
        .ToListAsync();
}