我有一个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排序。
任何想法如何对“一对多”关系的“多方”进行排序
答案 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