【问题标题】:.Net Core 3.1 dynamic multiple filtering of products.Net Core 3.1 产品动态多重过滤
【发布时间】:2021-06-15 20:44:42
【问题描述】:

多个复选框过滤器(动态)

过滤器=blue:1,red:1,ram16gb:2,ram38gb:2

.netcore 3.1 错误:无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

   public async Task<IActionResult> Index(SearchOption searchOption, int pageSize = 10)
    {

        var query = _productRepo.Query()
            .Include(x => x.AttributeValues)
            .Where(x => x.InActive == true);


        if (!string.IsNullOrWhiteSpace(searchOption.filter))
        {

            var list = searchOption.filter.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                   .Select(item =>
                   {
                       var subItems = item.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                       return new SplitFilter
                       {
                           AttributeId = Convert.ToInt64(subItems[1]),
                           Search = subItems[0],
                       };
                   }).ToList();

            if (list?.Any() == true)
            {
                var attr = _modelAttributeValueRepository
                    .GetFind(x => list.Any(j => j.Search == x.Value && j.AttributeId == x.AttributeId))
                    .Select(x => x.ProductId);
          
                query = query.Where(x => attr.Contains(x.ProductId));
            }
        }
        
        return View(query.ToList());
    }

【问题讨论】:

  • 你能告诉我你把这些代码放在哪里了吗?这些代码在控制器内部运行良好。
  • 写入控制器

标签: asp.net asp.net-core .net-core


【解决方案1】:

尝试像这样更改您的代码

var attr = _modelAttributeValueRepository
                    .GetFind(x => list.Any(j => j.Search == x.Value && j.AttributeId == x.AttributeId))
                    .Select(x => x.ProductId)
                    .ToList(); // add this line 
          
query = query.Where(x => attr.Contains(x.ProductId));

你也可以像这样重写你的查询:

query = query.Where(x => attr.Any(z => z == x.ProductId));

【讨论】:

  • 和异常一样吗?
【解决方案2】:

此代码有效。✓

public async Task<IActionResult> Index(SearchOption searchOption, int pageSize = 10)
    {

        var query = _productRepo.Query()
            .Include(x => x.AttributeValues)
            .Where(x => x.InActive == true);


        if (!string.IsNullOrWhiteSpace(searchOption.filter))
        {
            var list = searchOption.filter.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                   .Select(item =>
                   {
                       var subItems = item.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                       return new SplitFilter
                       {
                           AttributeId = Convert.ToInt64(subItems[1]),
                           Search = subItems[0],
                       };
                   })
                   .GroupBy(x => x.AttributeId).Select(x => new { AttributeId = x.Key, List = x.Select(j => j.Search) })
                   .ToList();

            if (list?.Any() == true)
            {
                foreach (var item in list)
                {
                    var attr = _modelAttributeValueRepository
                        .GetFind(x => item.AttributeId == x.AttributeId && item.List.Contains(x.Value))
                        .Select(x => x.ProductId)
                        .ToList();

                    query = query.Where(x => attr.Contains(x.ProductId));
                }
            }
        }

        return View(query.ToList());
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多