在实体框架中对多个进行排序

时间:2012-08-26 14:04:40

标签: c# .net entity-framework

我有三个表:ItemsCategory和联结表CategoryItems。物品和类别有很多关系。

CategoryItems有三列:Category_IdItem_IdPosition

如何使用Position使用Entity Framework对项目进行排序?

我正在使用此模型构建器:

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

2 个答案:

答案 0 :(得分:4)

如果您的联结表(CategoryItems)在关系的每一端都有外键上的其他列(在这种情况下,Position,那么EF不支持映射多对多关系})。您需要创建另一种类型(例如CategoryItem)并将映射配置为此类型的两对一关系。

在这种情况下,您的CategoryItem类型都会有(例如)CategoryItem个集合,CategoryItem类型会有CategoryItem财产。

因此,要获取按位置排序的类别的项目列表,您可以执行以下操作:

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查询来更改位置。