我在StackOverflow.com上阅读了其他帖子和评论,但无法理解解决方案。
以下是代码:
var qry = (from m in db.Messages
join r in db.Recievers on m.Id equals r.Message_Id
let a = m.SendDate
let b = (m.DoneDate != null ? m.DoneDate : DateTime.MinValue)
let c = m.Comments.Max(c => c.CommentDate)
let d = (c != null ? c : DateTime.MinValue)
let e = (radDropDownList1.SelectedIndex == 0 ? a : a >= b ? a >= d ? a : d : b >= d ? b : d)
orderby e descending
select m).Distinct();
注意:
radDropDownList1有两个项目。 0表示orderby必须基于消息的SendDate,1表示orderby必须基于SendDate,DoneDate和注释中的最大日期中的最大值。上面的代码不会返回我期望的结果。请帮帮我。
答案 0 :(得分:1)
根据我的第一眼看,启动e
变量的代码写错了。
使用条件if ... then ... elseif
运算符的正确?:
语句应如下所示:
var answer = condition ? first_expression : second_expression
请参阅:?: Operator (C# Reference)
使用标准符号将它分成多行:
if (radDropDownList1.SelectedIndex == 0)
a
else if (a >= b)
if (a >= d)
a
else
d
else if (b >= d)
b
else
d
注意:我不使用{}
括号来使代码更易于阅读。
如果您使用多个if... then ... elseif
语句,则必须谨慎行事!
答案 1 :(得分:0)
上面的代码没有返回我期望的结果:你是条件表达式的原因
我建议你这样写:
let e = radDropDownList1.SelectedIndex == 0 ? a /*order by SendDate*/
/*otherwise , order by MAX(a, b, c)*/
: new DateTime(Math.Max(a.Ticks, Math.Max(b.Ticks, c.Ticks)))
修改强>
对不起,正如您所提到的,SQL不会知道DateTime Ticks
让我们以这种方式找到最大值:
var selectedIndex = radDropDownList1.SelectedIndex;
var query =
(from m in db.Messages
join r in db.Recievers
on m.Id equals r.Message_Id
let a = m.SendDate
let b = (m.DoneDate != null ? m.DoneDate : DateTime.MinValue)
let c = m.Comments.Max(c => c.CommentDate)
let d = (c != null ? c : DateTime.MinValue)
let tempMax1 = a > b ? a : b
let tempMax2 = tempMax1 > c ? tempMax1 : c
let e = (
selectedIndex == 0 ? a /*order by SendDate*/
: tempMax2) /*otherwise , order by MAX(a, b, c)*/
orderby e descending
select m)
.Distinct();
P.S。优雅将取决于你;)