排序一对多关系的集合 - 实体框架代码优先

时间:2011-09-08 13:19:40

标签: entity-framework entity-framework-4.1 ef-code-first code-first

我有一个codefirst实体模型,它有两个实体,City和Locality。城市与地方有一对多的关系。以下是它们的相关性。

public class City {
    public virtual List<Locality> Localities { get; set; }
}

public class Locality {
    public virtual City City { get; set; }
}

现在我有一些代码可以找到特定的城市并加载该城市的地区。我希望使用LINQ IQueryable这样的“名称”对加载的Localities进行排序

city = context.Cities.AsNoTracking().Include(c => c.Localities.OrderBy(l => l.Name))
                                    .Where(c => c.Id == id).FirstOrDefault();

当我使用上面的代码时,它会抛出“ArgumentException”。所以我尝试了下面显示的代码。

city = context.Cities.AsNoTracking().Include(c => c.Localities)
                                    .Where(c => c.Id == id).FirstOrDefault();
if (city != null) {
     city.Localities.OrderBy(l => l.Name);
}

上面的代码不会抛出任何异常,但它不会按名称对Localities进行排序。我得到的地方已按ID排序。

任何想法如何对“一对多”关系的“多方”进行排序

1 个答案:

答案 0 :(得分:3)

LINQ查询不会修改源集合。您需要创建一个新的已排序City.Localities实例:

if (city != null) {
    city.Localities = city.Localities.OrderBy(l => l.Name).ToList();
}

在加载父集合和子集合之后,这将在内存中排序。

并且您的代码第一个代码段不起作用,因为您无法在急切的加载语句中指定排序或过滤条件。

这是另一个答案,对同一个问题有更多评论:Entity Framework, MVC 3, OrderBy in LINQ To Entities