LINQ to SQL lambda exp。 OrderBy,Case When

时间:2009-10-10 16:03:21

标签: linq-to-sql datetime lambda sql-order-by case

需要你的帮助。

我正在尝试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()
);

3 个答案:

答案 0 :(得分: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虽然不是最漂亮。

答案 1 :(得分:1)

为什么你不能这样做

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

如果r.AddDatetime本身可以为空,那么你可以删除强制转换,否则你需要进行强制转换才能确保Min函数返回DateTime?而不是DateTime

答案 2 :(得分:0)

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

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