LINQ left is only merged with the row with the maximum column value

I have a ProjectInformation table as (left table)

ProjectID int
{fields}

another table, ProjectUpdates (right table). This table contains several entries for 1 ProjectID added monthly.

ProjectID int
CreateDate date
{other fields that have records}

Their ratio is 1-M. Data examples

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"}

I want my LINQ query to return the following data (1 row for each project)

Criteria: the row in the left table will be joined with the right in the list that has the highest CreateDate value for the project.

{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"}
+4
source share
3 answers

. :

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();
+2

one to many ProjectInformation ProjectUpdate OrderByDescending/FirstOrDefault.

public class ProjectInformation {
  public int ProjectID { get; set; }
  public virtual ICollection<ProjectUpdate> ProjectUpdates { get; set; }
}

db.Project
  .Select(p => new {
    ProjectID = p.ProjectID,
    MostRecentProjectUpdate = p.ProjectUpdates.OrderByDescending(u => u.CreateDate).FirstOrDefault()
});

. OrderByDescending , CreateDate - , .

+2

Try the following: -

var result = (from pi in projectInfo
              join pu in projectupdates
              on pi.ProjectID equals pu.ProjectID into g
              let data = g.OrderByDescending(x => DateTime.ParseExact(x.CreateDate, 
                           "dd/M/yyyy", CultureInfo.InvariantCulture)).FirstOrDefault()
              select new
              {
                  ProjectID = data.ProjectID,
                  CreatedDate = data.CreateDate,
                  DataA = pi.DataA,
                  DataB = data.DataB
               }).ToList();

Working script .

Please note: as I use FirstOrDefault, you need to check if the data is not invalid before accessing its properties.

0
source

All Articles