关于c#:Entity Framework v2.1.3:对象的顺序属性(对象列表)

Entity Framework v2.1.3: Order property (list of objects) of object

标题措辞不好,我知道。

我有一个对象 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: The Include property lambda expression 'user => {from Alert alert in user.Alerts orderby [alert].LastActivatedDt asc select [alert]}' is invalid. The expression should represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, specify an explicitly typed lambda parameter of the target type, E.g. '(Derived d) => d.MyProperty'.

相关讨论

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

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

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) 会更快吗?

以上是关于c#:Entity Framework v2.1.3:对象的顺序属性(对象列表)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>