Linq Dynamic OrderBy

时间:2016-05-17 05:39:18

标签: c# linq

我在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和注释中的最大日期中的最大值。上面的代码不会返回我期望的结果。请帮帮我。

2 个答案:

答案 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。优雅将取决于你;)