【问题标题】:Entity Framework v2.1.3: Order property (list of objects) of objectEntity Framework v2.1.3:对象的顺序属性(对象列表)
【发布时间】:2018-09-11 14:14:43
【问题描述】:

标题措辞不好,我知道。

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

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

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

但我收到以下错误:

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

【问题讨论】:

  • 你不能在包含中做到这一点。您应该在包含后订购您的警报

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


【解决方案1】:

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

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

您不能就地订购用户的警报。您必须使用排序结果设置一些其他变量。

【讨论】:

  • 对于用户列表,我最终做了users.OrderBy(u => u.Id).ThenBy(u => u.Alerts.Min(a => a.LastActivatedDt)
  • 对于个人用户,做user = users.FirstOrDefault(u => u.id); user.Alerts.OrderBy(a => a.LastActivatedDt)会不会更快?
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多