首页 > 解决方案 > 如何在 for 循环中使用 OR 语句过滤 IQueryable

问题描述

我正在尝试按颜色 ID过滤产品列表,并且我想显示具有此颜色列表的所有产品,并且我正在应用分页,这就是我使用 IQueryable 的原因。

我尝试做这样的事情,但产品结果并没有得到所有的对象,比如:

if (!string.IsNullOrEmpty(productsParams.ColorsId))
        {
            var colorsIds = productsParams.ColorsId.Split(',');
            List<Product> filtredProducts = new List<Product>();

            foreach (var color in colorsIds)
            {
                var productColors = products.Where(c => c.ColorId == int.Parse(color));
                filtredProducts.AddRange(productColors);
            }
            products = filtredProducts.AsQueryable();
        }

但发生错误System.InvalidOperationException: The source IQueryable doesn't implement IAsyncEnumerable<YounesCo_Backend.Models.Product>. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.

我该如何过滤具有多种颜色的产品列表?

标签: c#asp.net-core

解决方案


  1. 一(和)

    if (!string.IsNullOrEmpty(productsParams.ColorsId))
    {
        var colorsIds = productsParams.ColorsId.Split(',');
        var query = products.AsQueryable() ;
        foreach (var color in colorsIds)
        {
            query = query.Where(c => c.ColorId == int.Parse(color));               
        }
        List<Product> filtredProducts = query.ToList();
    }
    
  2. 两个(或)

    if (!string.IsNullOrEmpty(productsParams.ColorsId))
    {
        int[]  colorsIds = ToIntArray(productsParams.ColorsId.Split(','));
        List<Product> filtredProducts = products.Where(c => colorsIds.Contains(c.ColorId)).ToList(); 
    }
    

你必须实现 ToIntArrat(List list) 方法,(Convert List<String[]> to Array int[][]


推荐阅读