需要你的帮助。
我正在尝试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()
);
答案 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期望对字段的引用,但三元操作的结果是一个值。