【问题标题】:Dynamic Where in linq with list parameters in action asp.net mvclinq 中的动态 Where 与操作 asp.net mvc 中的列表参数
【发布时间】:2018-06-22 07:50:36
【问题描述】:

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

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

   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。

【问题讨论】:

  • 使用 where(x => list.contains(x.someId))
  • 还有一件事,糖是我的布尔属性,我该如何处理它,prntscr.com/jxxt0e
  • @UsamaShahid 那么如果Sugar 是一个布尔属性,你为什么要传递List&lt;int&gt; sugar?而不是 List&lt;int&gt; sugar 在您的参数方法中应该是 bool sugar

标签: c# asp.net-mvc linq


【解决方案1】:

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

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

【讨论】:

  • 还有一件事,糖是我在数据库中的布尔属性。我以这种方式设置糖和非糖的值,prnt.sc/jxxt0e。请您指导我在这种情况下该怎么做。
  • @UsamaShahid 我在下面编辑了我的答案。您应该将sugar 作为bool? 传递并仅在用户选择它时设置其值。
  • @UsamaShahid 并且当用户选择 Sugar 和 NonSugar 时,您让值 null
  • @UsamaShahid 我无法访问此页面。它被阻止了:)你能把错误添加为评论吗?
  • 糟糕!这是我的错。我错过了在查询变量中再次分配它。 query = query.Where(x =&gt; x.Sugar == sugar) 非常感谢@CodeNotFound
【解决方案2】:

当您想要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();
}

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

正如您所提到的,sugar 是数据库中的 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();
}

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多