gpt4 book ai didi

c# - 关于 orderby 和 null 集合的 LINQ to Entities 问题

转载 作者:行者123 更新时间:2023-11-30 13:41:45 24 4
gpt4 key购买 nike

我目前正在开发一个论坛。我是 LINQ 和 EF 的新手。在我的论坛中,我有一个显示屏,首先显示最新主题的主题列表。

问题是“最近”是相对于主题的回复。所以我不想按主题的发布日期对列表进行排序,而是想按主题的最后回复的发布日期对列表进行排序。因此,具有较新回复的主题会弹出回到列表的顶部。如果我知道每个主题至少有一个回复,这就相当简单了;我会这样做:

var topicsQuery = from x in board.Topics
orderby x.Replies.Last().PostedDate descending
select x;

但是,在很多情况下,该主题没有回复。在这种情况下,我想改用主题的发布日期。如果主题没有回复,我的 linq 查询中是否有一种方法可以按 x.PostedDate 进行排序?我对此感到困惑。

对于上面的查询,由于假定有回复的 x.Replies.Last(),它在没有回复的主题上中断。 LastOrDefault() 不起作用,因为我需要访问 PostedDate 属性,该属性还假定存在回复。

最佳答案

var topicsQuery = from x in board.Topics
let lastActivityDate = x.Replies.Any()
? x.Replies.Last().PostedDate
: x.PostedDate
orderby lastActivityDate descending
select x;

编辑:

为了回答您的评论,linq 表达式语法没有“let”明确。但是,您可以通过以下方式实现相同的效果(使用中间选择表达式):

var topicsQuery = board.Topics.Select(x => new { 
Topic = x,
LastActivityDate = x.Replies.Any()
? x.Replies.Last().PostedDate
: x.PostedDate
})
.OrderByDescending(p => p.LastActivityDate)
.Select(r => r.Topic)

编辑2:

正如 Nicholas 所建议的那样,这可以进一步简化,我们也可以删除中间的 select 语句。请注意,如果不是不同的执行,这是不可能的。

var topicsQuery = board.Topics
.OrderByDescending(x => x.Replies.Any()
? x.Replies.Last().PostedDate
: x.PostedDate);

关于c# - 关于 orderby 和 null 集合的 LINQ to Entities 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4637771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com