【问题标题】:Entity Framework Simple Report实体框架简单报告
【发布时间】:2010-10-24 20:21:54
【问题描述】:

我将如何使用实体框架编写查询,其中我需要为产品、类别和父类别创建一个包含列的列表。我还没有弄清楚如何获得父类别。任何帮助表示赞赏。 到目前为止,我有以下内容:

from product in Products
select new { Ctg = (from prdCategory in ProductCategories
                    where prdCategory.Products.Contains(product)
                    select prdCategory.CategoryName).FirstOrDefault(),
             Name = product.ProductName
             ParentCtg = ...
    }

【问题讨论】:

  • 您能否澄清一下“父类别”是单独的表还是 ProductCategories 表上的自引用列(如 ProductCategory 表上引用 ProductCategoryID PK 的 ParentID FK)?
  • 我应该提到父级是同一个 ProductCategories 表中的一个自引用列。所以它是一对多的 ProductCategoriesId:ParentProductCategoriesId。每个产品都有一个类别,每个类别都可以有父级。

标签: c# entity-framework linq-to-entities


【解决方案1】:

好的,如果所有关联都已从您的数据库中正确设置,那么这将是一个简单的查询:

var product = from p in context.Products
              select new {
                 Name = product.ProductName,
                 CategoryNames = p.ProductCategories
                         .Select(c => c.CategoryName).ToList(),
                 ParentCategories = p.ProductCategories
                         .Select(c => c.ProductCategory2.CategoryName).ToList()
              };

当 EF 映射自引用关联时,它会创建两个相关的导航属性,名为 ProductCategory1ProductCategory2。这些名称都不是特别有用,这些导航属性之一是指父类别或关系的 0..1 侧。另一个是指关系的孩子或 * 方。
要了解哪个是哪个,右击ProductCategory1,在属性窗口中,ProductCategory1的重数是*(很多),所以ProductCategory1代表子类别或子类别的导航属性(也是 EntityCollection<ProductCategory> 类型),另一个 - ProductCategory2 - 表示此类别的父类别,它的类型为 ProductCategory。对于您的查询,我们对此感兴趣。
此外 - 为了使您的查询更具可读性 - 您可以将 ProductCategory1 重命名为 Subcategories 并将 ProductCategory2 重命名为 ParentCategory

【讨论】:

  • 我刚刚意识到它实际上是多对多关系,所以我实际上得到的是 p.ProductCategories,它是一个实体集合,而不是 p.ProductCategory.CategoryName
  • 好的,我们会处理的,但是父类别仍然是同一个 ProductCategories 表中的自引用列,对吗?
  • 是的,该类别的父类别是 ProductCategories 表中的自引用列。
  • 好的,我已经更新了我的代码,根据您的描述,它应该适合您。
  • 我只需将最后一个选择编辑为“pc => pc.CategoryID == product.ProductCategories.FirstOrDefault().ParentID”,它现在可以工作了。感谢您的帮助!
【解决方案2】:

如果我正确理解您的架构,它应该是获取简单产品列表的简单案例,并且您的显示列表应该只显示一个显示“thisProduct.Category.Name”的列。

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多