适当的Linq查询对象与多对多的关系产生的代码首先实体框架

本文关键字:代码 框架 实体 Linq 查询 对象 关系 | 更新日期: 2023-09-27 18:16:41

我有两个对象模型,Product &产品类别

public class Product{
    int Id {get; set;}
    public virtual ICollection<ProductCategory> Categories { get; set; }
}
public class ProductCategory{
    int Id {get; set;}
    public virtual ICollection<Product> Products { get; set; }
}

具有多对多关系,使用实体框架中的代码优先方法生成。

  modelBuilder.Entity<Product>().
            HasMany(p => p.Categories).
            WithMany(c => c.Products)
            .Map(m =>
            {
                m.MapLeftKey("ProductId");
                m.MapRightKey("CategoryId");
                m.ToTable("ProductJoinProductCategory");
            });

查询

var productCategory = await db.ProductCategories.FirstOrDefaultAsync(category => category.Id == Id);

Products集合返回空,即使我的数据库在ProductJoinProductCategory表中填充了几个产品。

目前,我正在执行以下操作来填充产品集合

  var productCategory = await db.ProductCategories.FirstOrDefaultAsync(category => category.Id == Id);
  productCategory.Products = db.Products.Where(x => x.Categories.Any(p => p.Id == Id)).ToList();

是否有办法在单个查询中完成此操作?产品对象最终将与其他对象有多个多对多关系,我想找出查询对象并返回其所有已填充的多对多字段集合的正确方法。

适当的Linq查询对象与多对多的关系产生的代码首先实体框架

我认为下面的方法应该有效:

var productCategory = await db.ProductCategories.Include(p => p.Categories.Select(c => c.Products)).FirstOrDefaultAsync(category => category.Id == Id);