2009-10-10 48 views
0

需要您的帮助。LINQ to SQL lambda exp。 OrderBy,Case When

我想OrderBy的第一个答复datetime如果存在。如果它为空/空,它必须按主题日期时间排序。我已经结束了与下面的表达式,但它只是似乎没有工作:(

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() 
); 

回答

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不会是最漂亮的。

0

您将需要两个Linq的语句,每个排序依据,使用IF语句来决定哪些LINQ的声明返回。

问题与您现有的代码是拉姆达期待到现场的引用,但三元操作的结果是一个值。

1

为什么不能你只是做

回报db.Topics 。凡(T => t.ForumID == ID) .OrderBy(t.Replies.Min(R =>(日期时间?)R。 AddDateTime)?? t.AddDateTime) 。选择(R => r.AddDatetime) 。首先()

如果r.AddDatetime本身可为空,那么你可以删除投,否则你需要投在做肯定Min函数返回DateTime?而不是DateTime