我正在屏幕上显示产品列表,但是当用户单击不同的复选框时,我在action参数中得到了checked复选框的值。这是我的屏幕。
现在我要在不同的项目选择上动态请求查询。
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。
答案 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();
}