我目前正在开发一个使用实体框架的 .NET 项目。我需要帮助按日期对用户进行排序。具体来说,我需要根据多个日期对用户进行排序。在用户实体中,有 createDate 和 updateDate 字段。此外,每个用户都包含一个项目列表,每个项目还拥有 createDate 和 updateDate 属性。
我的目标是按最新用户日期或用户项目上次更新或创建日期对用户进行排序:user.createDate、user.updateDate、item.createDate 和 item.updateDate。
但是,如果我更新用户项目并且该项目将具有更新日期,我还需要更喜欢该用户更新的项目。这意味着如果用户项目日期比其他用户创建或更新日期更新,则拥有更新项目的用户将被优先选择。
public class User
{
public Guid Id { get; set; }
public string FirstName { get; set; };
public string LastName { get; set; };
public string Email { get; set; };
public virtual ICollection<Item> Items { get; set; };
public Datetime CreatedDate { get; set; }
public Datetime? UpdatedDate { get; set; }
}
public class Item
{
public Guid Id { get; set; }
public string Name { get; set; };
public Datetime CreatedDate { get; set; }
public Datetime? UpdatedDate { get; set; }
}
我尝试过,例如,我尝试使用多列排序,但在这种情况下,不首选具有更新项目的用户。
users = users
.OrderByDescending(u => u.UpdatedAt ?? u.CreatedAt)
.ThenByDescending(u => u.Items.Any() ? u.Items.Max(i => i.UpdatedAt ?? i.CreatedAt) : DateTime.MinValue)
您能否建议我如何仅使用 IQueryable 来实现这种排序?这可行吗?
您只需在正确的位置使用
OrderBy
和 ThenBy
即可完成订单。所以你需要这样的东西:
var users = context.Users
.Include(x => x.Items.OrderByDescending(x => x.CreatedDate).ThenByDescending(x => x.UpdatedDate))
.OrderByDescending(x => x.CreatedDate)
.ThenByDescending(x => x.UpdatedDate)
.ToList();