我有三个表:Items
和Category
junction 表CategoryItems
。项目和类别具有多对多关系。
CategoryItems 具有三列Category_Id
:Item_Id
和Position
。
如何使用Position
Entity Framework 对我的项目进行排序?
我正在使用这个模型构建器:
modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
我有三个表:Items
和Category
junction 表CategoryItems
。项目和类别具有多对多关系。
CategoryItems 具有三列Category_Id
:Item_Id
和Position
。
如何使用Position
Entity Framework 对我的项目进行排序?
我正在使用这个模型构建器:
modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
CategoryItems
如果您的联结表 ( ) 在关系的每一端(在本例中为 )的外键上有附加列,则EF 不支持映射多对多关系Position
。您将需要创建另一种类型(例如CategoryItem
)并将您的映射配置为与此类型的两个一对多关系。
在这种情况下,您的Category
和Item
类型都将具有(例如)CategoryItem
集合,并且CategoryItem
类型将具有Category
andItem
属性。
因此,要获取按位置排序的类别的项目列表,您可以执行以下操作:
var category = context.Categories.Find(categoryId);
var orderedItems =
category.CategoryItems.OrderBy(ci => ci.Position).Select(ci => ci.Item);
您可能想要选择一个比 更好的名称CategoryItem
,因为虽然这是一个描述联结表的好名称,纯粹是为了建模多对多关系,但在您的情况下,它实际上本身就是一个实体。
我最终使用它来加载类别项目:
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 查询来更改位置。