0

在这方面需要你的帮助。

我正在尝试 OrderBy 首先回复日期时间(如果存在)。如果为空/null,则必须按主题日期时间排序。我最终得到了以下表达式,但它似乎不起作用:(

return db.Topics
.Where(t => t.ForumID == id)
.OrderBy(
    t => t.Replies
    .OrderBy(r => r.AddDatetime.Equals(System.Data.SqlTypes.SqlDateTime.Null.Value) ? t.AddDatetime : r.AddDatetime)
    .Select(r => r.AddDatetime)
    .First()
);
4

3 回答 3

1

如果您可以接受返回 POCO 对象,则可以执行以下操作:

var pocoenum = db.Topics
.Where(t => t.ForumID == id)
.Select(
new {
    ...
    AddDatetime = t.Replies.Select(r => r.AddDateTime).FirstOrDefault == null ? t.AddDatetime : t.Replies.Max(r => r.AddDateTime)
};

return pocoenum.OrderBy(p => p.AddDatetime)

SQL 不会是最漂亮的。

于 2009-10-12T14:13:36.183 回答
1

为什么你不能做

返回 db.Topics .Where(t => t.ForumID == id) .OrderBy( t.Replies.Min(r=>(DateTime?)r.AddDateTime) ?? t.AddDateTime) .Select(r => r .AddDatetime) .First()

如果 r.AddDatetime 本身可以为空,那么您可以删除演员表,否则您需要该演员表以确保 Min 函数返回 DateTime?而不是日期时间

于 2010-01-11T00:48:23.657 回答
0

您将需要两个 Linq 语句,每个 OrderBy 一个。使用 If 语句来决定返回哪个 Linq 语句。

您现有代码的问题是 lambda 期望引用一个字段,但三元运算的结果是一个值。

于 2009-10-10T16:16:49.590 回答