我有这两个模型(多对多关系):
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查询,因为对子集合进行了过滤。有什么想法吗?
答案 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字段)