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

LINQ分组:选择行而不是键?

  •  1
  • Ocelot20  · 技术社区  · 14 年前

    我可能无法很好地解释这一点,但现在…

    我有一张类似的桌子:

    Id | Foreign_Key_Id | A_Number | Some_Other_Info
    1      1                100          Red
    2      1                200          Blue
    3      1                300          Orange
    4      2                100          Green
    5      2                200          Yellow
    6      3                100          Brown
    

    我想获取此表中特定“foreign-key-id”的最大“a_号”,但同时返回记录的其余部分,以便从“some-other-in-info”列获取信息。

    我发现我可以通过这样的查询来完成:

    from x in This_Table
    group x by x.Foreign_Key_Id into g
    orderby g.Max(x => x.A_Number) descending
    select g.Where (x => x.Foreign_Key_Id == g.Key).OrderByDescending (x => x.A_Number).First()
    

    编辑:或者更简洁的查询:

    from x in This_Table
    group x by x.Foreign_Key_Id into g
    let maxANumber = g.Max(x => x.A_Number)
    orderby maxANumber descending
    select g.Where(x => x.A_Number == maxANumber).First()
    

    尽管我不太确定如果一个外键ID有两个具有相同“a_号”值的记录(这在我所指的表中是可能的,我只需要取最近的一个)它将需要哪个记录。

    在我的例子中,我相信会返回:

    Id | Foreign_Key_Id | A_Number | Some_Other_Info
    3      1                300          Orange
    5      2                200          Yellow
    6      3                100          Brown
    

    似乎必须有一种更简单的方式来实现这一点(这使得查询比我提出的查询速度更快),我只是不知道怎么做。

    提前谢谢。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Ronald Wildenberg    14 年前

    以下内容也有效。您可以在组内订购:

    from x in This_Table
    group x by x.Foreign_Key_Id into g
    select g.OrderByDescending(y => y.A_Number).First();
    

    在以下时间录制最新记录 A_Number s等于等于加上另一个 OrderBy 查询。