使用LINQ过滤子集合

时间:2017-05-22 17:56:22

标签: c# linq

我有这两个模型(多对多关系):

public class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }

    #region Navigation properties 
    public List<Category> Categories { get; set; }
    #endregion
}

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }

    #region Navigation properties
    public List<Product> Products { get; set; }
    #endregion
}

然后我有这个动作方法:

[HttpPost]
public async Task<ActionResult> FilterProducts(List<int> categoryIds)
{
    var productsViewModel = new ProductsViewModel();

    if (categoryIds != null)
    {
        var products = await db.Products
                   .AsNoTracking()
                   .Where(??????????????????????)
                   .Where(p => p.Visible == true)
                   .OrderBy(p => p.Importance)
                   .ToListAsync();

        productsViewModel.Products = products;
    }
    else { // Do something else }

    return PartialView("_ProductsPartial", productsViewModel);
}

我想要做的是使用LINQ(categoryIds)通过.Where(??????)获取所有产品。因此每个产品都有一个类别列表。我想只获取包含categoryIds的产品。

不确定如何构造LINQ查询,因为对子集合进行了过滤。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这将返回至少有Products

中一个类别的所有categoryIds
.Where(x => x.Categories.Any(y => categoryIds.Contains(y.CategoryId)));

答案 1 :(得分:0)

这将返回全部 categoryIds

的产品
Where(p => categoryIds.
         Intersect(p.Categories.Select(ctgry => ctgry.CategoryId)).
         Count() == categoryIds.Count())

(假设categoryIds具有唯一元素,List Categories的元素具有唯一的CategoryId字段)