【问题标题】:Sorting many to many in entity framework在实体框架中对多对多进行排序
【发布时间】:2012-08-26 23:52:46
【问题描述】:
我有三个表:Items、Category 和联结表CategoryItems。项目和类别具有多对多关系。
CategoryItems 包含三列:Category_Id、Item_Id 和 Position。
如何使用Position 使用 Entity Framework 对我的项目进行排序?
我正在使用这个模型构建器:
modelBuilder
.Entity<Category>()
.HasMany(c => c.Items)
.WithMany();
【问题讨论】:
标签:
c#
.net
entity-framework
【解决方案1】:
如果您的联结表 (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 更好的名称,因为虽然这是一个描述联结表的好名称,纯粹是为了建模多对多关系,但在您的情况下,它实际上是一个实体自己。
【解决方案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 查询来改变位置。