【问题标题】:Ordering Included Entity订购包含的实体
【发布时间】:2019-08-14 20:46:44
【问题描述】:

我正在使用实体框架 v2.2.3。我正在尝试使用以下代码订购子实体,但它不起作用。

var result= _databaseContext.Movie.AsNoTracking().Include(p => p.Cast.OrderByDescending(c => c.Birthday)).ToList();

错误:

Include 属性 lambda 表达式 'p => {from Cast c in p.Casts orderby [c].Birthday desc select [c]}' 无效。该表达式应表示属性访问:'t => t.MyProperty'。要定位在派生类型上声明的导航,请指定目标类型的显式类型 lambda 参数,例如'(派生 d)=> d.MyProperty'。有关包含相关数据的更多信息,请参阅http://go.microsoft.com/fwlink/?LinkID=746393

实体:

public class Movie
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Cast> Casts { get; set; }
    }

  public class Cast
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Birthday { get; set; }
    }

你有什么想法吗?

【问题讨论】:

  • 显示你的模型类(电影和演员),我可以完成我的答案..
  • @RistoM 我添加了实体,您的回答不适用于我的场景

标签: entity-framework entity-framework-core


【解决方案1】:

正如我们看到的herehere 一样,无法对预先加载的 (.Include-queried) 子集合进行排序。

您必须先加载电影,然后对其 Casts 集合进行排序。试试这个:

var result= _databaseContext.Movie.AsNoTracking().Include(p => p.Casts).ToList();

results.ForEach(x => x.Casts = x.Casts.OrderBy(y => y.BirthDay).ToList());

【讨论】:

  • 我在问题中添加了实体。正如你所看到的电影有一个演员集合,所以这个不适合我。您还有其他解决方案吗?
  • 感谢您提供更多信息。现在,当关系是一对多时,不是 100% 清楚您要对什么进行排序:您是否要对您的电影收藏进行排序(即按电影中最老演员的标准)?还是您想对每部电影的演员集进行排序?
  • I@RistoM 我想获得带有演员阵容的电影,但每部电影的演员名单必须按“生日”排序。现在清楚了吗?
  • 有没有办法在获取列表之前处理它,我的意思是在查询部分?
  • 没有。使用 .Include -clause 进行选择时,很遗憾,答案是否定的。您必须创建自己的 sql(使用即 Dapper-library)或使用自己的有序查询加载 Casts,与电影加载分开。关于我放在这个答案上的那些链接有很好的讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2022-11-12
  • 2015-10-31
  • 2011-04-05
  • 2016-11-07
相关资源
最近更新 更多