Proper Linq查询与代码第一实体框架生成的具有多对多关系的对象

时间:2014-08-06 08:22:34

标签: c# linq entity-framework-6

我有两个对象模型,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);

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

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

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

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

1 个答案:

答案 0 :(得分:1)

我认为以下内容应该有效:

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