C# 实体框架v2.1.3:对象的顺序属性(对象列表)

C# 实体框架v2.1.3:对象的顺序属性(对象列表),c#,entity-framework-core,asp.net-core-2.1,C#,Entity Framework Core,Asp.net Core 2.1,我知道,这是一个措辞拙劣的标题 我有一个对象用户,它有一个属性(对象列表)(ICollection)警报。我想按警报的属性(DateTime)LastActivatedDt 我尝试过(在一个带有int-id参数的方法中): 但我得到了以下错误: System.InvalidOperationException:Include属性lambda表达式“user=>{from Alert Alert in user.Alerts orderby[Alert].LastActivatedDt asc s

我知道,这是一个措辞拙劣的标题

我有一个对象
用户
,它有一个属性(对象列表)
(ICollection)警报
。我想按警报的属性
(DateTime)LastActivatedDt

我尝试过(在一个带有
int-id
参数的方法中):

但我得到了以下错误:

System.InvalidOperationException:Include属性lambda表达式“user=>{from Alert Alert in user.Alerts orderby[Alert].LastActivatedDt asc select[Alert]}”无效。表达式应表示属性访问:“t=>t.MyProperty”。要将在派生类型上声明的导航作为目标,请指定目标类型的显式类型lambda参数,例如“(派生d)=>d.MyProperty”

你不能在include中这样做,实际上你根本不需要include来达到这个特定的目的。只要做:

users.OrderBy(o => o.Alerts.Min(a => a.LastActivatedDt)).FirstOrDefault();
您也可以使用
Max
。这取决于您最终希望如何订购,但由于您处理的是一系列物品,因此您必须从中挑选一个来实际订购

编辑

出于某种原因,我在通过特定id部分获取用户的过程中完全没有时间。我想您实际上想要实现的是拉出一个特定的用户,同时对他们的警报集合进行适当的排序。这实际上是不可能的。您需要做的是以下几点:

var user = users.Include(x => x.Alerts).SingleOrDefault(x => x.Id == id);
var alerts = user.Alerts.OrderBy(o => o.LastActivatedDt);
您无法就地订购用户的警报。您必须在排序结果中设置其他变量。

您不能在include中执行此操作,实际上,出于此特定目的,您根本不需要include。只要做:

users.OrderBy(o => o.Alerts.Min(a => a.LastActivatedDt)).FirstOrDefault();
您也可以使用
Max
。这取决于您最终希望如何订购,但由于您处理的是一系列物品,因此您必须从中挑选一个来实际订购

编辑

出于某种原因,我在通过特定id部分获取用户的过程中完全没有时间。我想您实际上想要实现的是拉出一个特定的用户,同时对他们的警报集合进行适当的排序。这实际上是不可能的。您需要做的是以下几点:

var user = users.Include(x => x.Alerts).SingleOrDefault(x => x.Id == id);
var alerts = user.Alerts.OrderBy(o => o.LastActivatedDt);

您无法就地订购用户的警报。您必须在排序结果中设置其他变量。

您不能在include中进行设置。您应该在include之后订购alers您不能在include内订购。你应该在包含用户列表后订购Aler。对于一个用户列表,我最后做的是
users.OrderBy(u=>u.Id)。然后是by(u=>u.Alerts.Min(a=>a.LastActivatedDt)
。对于单个用户来说,做
user=users.FirstOrDefault(u=>u.Id);user.Alerts.OrderBy(a=>a.LastActivatedDt)会更快吗
?对于一个用户列表,我最后做了
users.OrderBy(u=>u.Id)。然后做了
u.Alerts.Min(a=>a.LastActivatedDt)
。对于单个用户,做
user=users.FirstOrDefault(u=>u.Id);user.Alerts.OrderBy(a=>a.LastActivatedDt)