我有三个表:Items
,Category
和联结表CategoryItems
。物品和类别有很多关系。
CategoryItems有三列:Category_Id
,Item_Id
和Position
。
如何使用Position
使用Entity Framework对项目进行排序?
我正在使用此模型构建器:
modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
答案 0 :(得分:4)
CategoryItems
)在关系的每一端都有外键上的其他列(在这种情况下,Position
,那么EF不支持映射多对多关系})。您需要创建另一种类型(例如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
更好的名字,因为尽管这是一个很好的名称来描述一个纯粹为了模拟多对多关系的联结表,但在你的情况下它是实际上是一个实体。
答案 1 :(得分:1)
我最终使用它来加载类别项目:
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查询来更改位置。