实体框架v2.1.3:对象的Order属性(对象列表)

时间:2018-09-11 14:14:44

标签: c# entity-framework-core asp.net-core-2.1

我知道标题的字眼不正确。

我有一个对象User,它具有一个属性(对象列表)(ICollection<Alert>) Alerts。我想通过警报的属性(DateTime) LastActivatedDt

订购警报

我尝试过(在具有参数int id的方法中):

user = users
    .Include(user => user.Alerts.OrderBy(alert => alert.LastActivatedDt)
    .FirstOrDefault(user => user.Id === id)

但是出现以下错误:

  

System.InvalidOperationException:包含属性lambda表达式'user => {来自user.Alerts中的Alert警报。警报按[alert] .LastActivatedDt asc select [alert]}排序”无效。该表达式应表示属性访问:“ t => t.MyProperty”。要定位在派生类型上声明的导航,请指定目标类型的显式键入的lambda参数,例如“(派生d)=> d.MyProperty”。

1 个答案:

答案 0 :(得分:3)

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

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);

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