LINQ 左连接仅具有列最大值的行

Tah*_*qui 5 c# sql linq oracle

我有一个表ProjectInformation作为(左表)

ProjectID int
{fields}
Run Code Online (Sandbox Code Playgroud)

另一个表ProjectUpdates(右表)。此表有多个记录,每月添加 1 个 ProjectID。

ProjectID int
CreateDate date
{other fields that have records}
Run Code Online (Sandbox Code Playgroud)

他们的关系是1-M。样本数据

ProjectInformation
{ ProjectID = 1, DataA = "ABC"}
{ ProjectID = 2, DataA = "DEF"}
{ ProjectID = 3, DataA = "GHI"}

ProjectUpdates
{ProjectID = 1, CreateDate = "24/2/2014", DataB = "JKL"}
{ProjectID = 1, CreateDate = "25/1/2014", DataB = "MNL"}
{ProjectID = 1, CreateDate = "23/12/2014", DataB = "PQR"}
{ProjectID = 1, CreateDate = "23/11/2014", DataB = "STU"}
{ProjectID = 2, CreateDate = "24/2/2014", DataB = "VWX"}
{ProjectID = 2, CreateDate = "24/1/2014", DataB = "YZA"}
{ProjectID = 3, CreateDate = "21/12/2014", DataB = "BCD"}
{ProjectID = 3, CreateDate = "24/11/2014", DataB = "EFG"}
{ProjectID = 3, CreateDate = "24/10/2014", DataB = "HIJ"}
{ProjectID = 3, CreateDate = "24/8/2014", DataB = "KLM"}
{ProjectID = 3, CreateDate = "24/6/2014", DataB = "NOP"}
Run Code Online (Sandbox Code Playgroud)

我希望我的 LINQ 查询返回以下数据(每个项目 1 行)

条件:左表中的行将与右侧具有项目的CreateDate值最大的行连接。

{ProjectID = 1, CreateDate = "24/2/2014", DataA ="ABC", DataB = "JKL"}
{ProjectID = 2, CreateDate = "24/2/2014", DataA ="DEF", DataB = "VWX"}
{ProjectID = 3, CreateDate = "21/12/2014", DataA ="GHI", DataB = "BCD"}
Run Code Online (Sandbox Code Playgroud)

Gio*_*uri 4

您可以通过多种方式做到这一点。其中一种方法是:

var result = (from pi in projectInformations
              join pu in projectUpdates on pi.ProjectID equals pu.ProjectID into tpu
              from t in tpu.OrderByDescending(c => c.CreateDate).Take(1)
              select new { pi.ProjectID, pi.DataA, t.CreateDate, t.DataB }).ToList();
Run Code Online (Sandbox Code Playgroud)