我有三個表:Items
,Category
和聯結表CategoryItems
。項目和類別具有多對多的關係。在實體框架中排序多對多
CategoryItems有三列:Category_Id
,Item_Id
和Position
。
如何使用Position
對實體框架中的項目進行排序?
我使用這個模型生成器:
modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
我有三個表:Items
,Category
和聯結表CategoryItems
。項目和類別具有多對多的關係。在實體框架中排序多對多
CategoryItems有三列:Category_Id
,Item_Id
和Position
。
如何使用Position
對實體框架中的項目進行排序?
我使用這個模型生成器:
modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
我最終使用本作的類別項加載:
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查詢來改變位置。
EF不支持映射許多一對多的關係,如果你的結表(CategoryItems
)擁有的關係兩端的外鍵的其他列(在這種情況下,Position
)。您需要創建另一種類型(例如CategoryItem
),並將映射配置爲與此類型的兩個一對多關係。
在這種情況下,無論您Category
和Item
類型具有(例如)CategoryItem
集合,和CategoryItem
類型將有一個Category
和Item
財產。
因此,爲了獲得項目的列表按位置排序的類別,你會做這樣的事情:
var category = context.Categories.Find(categoryId);
var orderedItems =
category.CategoryItems.OrderBy(ci => ci.Position).Select(ci => ci.Item);
你可能想選擇一個更好的名字比CategoryItem
,因爲雖然這是一個好名字來描述一個聯結表,純粹是爲了建立一個多對多的關係,在你的情況下它實際上是一個實體。
感謝您的回答 – ErikTJ