【问题标题】:Sorting many to many in entity framework在实体框架中对多对多进行排序
【发布时间】:2012-08-26 23:52:46
【问题描述】:

我有三个表:ItemsCategory 和联结表CategoryItems。项目和类别具有多对多关系。

CategoryItems 包含三列:Category_IdItem_IdPosition

如何使用Position 使用 Entity Framework 对我的项目进行排序?

我正在使用这个模型构建器:

modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();

【问题讨论】:

    标签: c# .net entity-framework


    【解决方案1】:

    如果您的联结表 (CategoryItems) 在关系的每一端(在本例中为 Position)的外键上具有附加列,则 EF 不支持映射多对多关系。您将需要创建另一种类型(例如CategoryItem)并将您的映射配置为与此类型的两个一对多关系。

    在这种情况下,CategoryItem 类型都将具有(例如)CategoryItem 集合,CategoryItem 类型将具有 CategoryItem 属性。

    因此,要获取按位置排序的类别的项目列表,您可以执行以下操作:

    var category = context.Categories.Find(categoryId);
    var orderedItems = 
        category.CategoryItems.OrderBy(ci => ci.Position).Select(ci => ci.Item);
    

    您可能希望选择一个比CategoryItem 更好的名称,因为虽然这是一个描述联结表的好名称,纯粹是为了建模多对多关系,但在您的情况下,它实际上是一个实体自己。

    【讨论】:

      【解决方案2】:

      我最终使用它来加载类别项目:

       public IEnumerable<Item> Items
          {
              get
              {
                  using (var context = new CatalogueContext())
                  {
                      var ids = context.Database.SqlQuery<int>("SELECT Item_Id FROM CategoryItems WHERE Category_Id = " +
                                                               this.Id + " ORDER BY Position");
                      foreach (int id in ids)
                          yield return context.Items.Find(id);
      
                  }
              }
          } 
      

      然后使用 SQL 查询来改变位置。

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多