2012-08-26 37 views
1

我有三個表:Items,Category和聯結表CategoryItems。項目和類別具有多對多的關係。在實體框架中排序多對多

CategoryItems有三列:Category_Id,Item_IdPosition

如何使用Position對實體框架中的項目進行排序?

我使用這個模型生成器:

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

回答

0

我最終使用本作的類別項加載:

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查詢來改變位置。

3

EF不支持映射許多一對多的關係,如果你的結表(CategoryItems)擁有的關係兩端的外鍵的其他列(在這種情況下,Position)。您需要創建另一種類型(例如CategoryItem),並將映射配置爲與此類型的兩個一對多關係。

在這種情況下,無論您CategoryItem類型具有(例如)CategoryItem集合,和CategoryItem類型將有一個CategoryItem財產。

因此,爲了獲得項目的列表按位置排序的類別,你會做這樣的事情:

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

你可能想選擇一個更好的名字比CategoryItem,因爲雖然這是一個好名字來描述一個聯結表,純粹是爲了建立一個多對多的關係,在你的情況下它實際上是一個實體。

+0

感謝您的回答 – ErikTJ