代码之家  ›  专栏  ›  技术社区  ›  Kordonme

LINQ到SQL lambda exp.OrderBy,在

  •  0
  • Kordonme  · 技术社区  · 15 年前

    这件事需要你的帮助。

    我正在尝试按第一个答复日期时间订购(如果有)。如果为空/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 回复  |  直到 15 年前
        1
  •  1
  •   aanund    15 年前

    如果您可以接受返回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并不是最漂亮的。

        2
  •  1
  •   Bob Vale    15 年前

    .式中(t=>t、 ForumID==id) .OrderBy(t.repress.Min)(r=>(DateTime?)r.AddDateTime?)??t、 AddDateTime) .选择(r=>r、 AddDatetime) .First()

    如果r.AddDatetime本身可为空,则可以删除强制转换,否则需要该强制转换以确保Min函数返回DateTime?而不是日期时间

        3
  •  0
  •   Robert Harvey    15 年前

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

    现有代码的问题是lambda需要一个字段引用,但三元运算的结果是一个值。