使用Linq返回EF6中的相关实体

时间:2014-12-22 15:50:05

标签: c# linq entity-framework

我在理解Linq和EF如何返回数据时遇到了问题。我有三个简单的课程

产品, 材料, 文件

产品由材料和材料组成,有文件。当我加载产品时,我想返回产品所用材料的所有文档。

以下是我的课程:

    public class Product
    {        
      public int Id { get; set; }
      public string Name { get; set; }
      ...
      public ICollection<ProductMaterials> ProductMaterial { get; set; }
    }
    public class ProductMaterials 
    {           
        public int Id { get; set; }

        public int ProductId { get; set; }
        public Product Product { get; set; }
        public int MaterialId { get; set; }
        public Materials Material { get; set; }
        ...           
    }

public class Document
{
    public int Id { get; set; }
    public string Name { get; set; }
    ...
    public ICollection<MaterialDocument> MaterialDocument { get; set; } 
}

public class MaterialDocument
{
    public int Id { get; set; }
    public int MaterialId { get; set; }
    public Materials Material { get; set; }
    public int DocumentId { get; set; }
    public Document Document { get; set; }
}

我在加载材料及其相关文档时没有任何问题。我使用这个查询:

var materialDocuments = db.MaterialDocuments
                                     .Include("Document")
                                     .Where(i => i.MaterialId == id)
                                     .ToList();

如何使用相关材料和材料文档加载产品?我是否需要指向ProductMaterials的MaterialDocument类的其他导航属性?

1 个答案:

答案 0 :(得分:1)

要返回您正在加载的特定Document的所有Product条记录(请提供我们称之为myProductID的ID),只需执行以下操作:

var product = db.Products.Find(myProductID); //The product that you're loading
var documents = product.ProductMaterials.SelectMany(pm => 
                         pm.Material.SelectMany(mat => 
                            mat.MaterialDocuments.Select(matdoc => matdoc.Document)));