Linq group by multiple fields across different tables

后端 未结 1 1120
深忆病人
深忆病人 2021-02-08 16:01

In an attempt to convert this SQL query to LINQ I have hit a problem with group by. How can I group by multiple columns that originate from multiple tables? The linq query belo

相关标签:
1条回答
  • 2021-02-08 16:29

    For starters, your query is not equivalent. Minor things really like different values being checked but a major one is that you don't group by the same keys. The SQL grouped by JobCode which you left out in your query. And you attempted to group too much instead of ordering it. The values you are aggregating should be what you are grouping.

    As for why you're getting the syntax error, after you do a continuation (using into in a group by or select clause), all the variables in the previous scope are lost and only the continuation variable remains (g1 in your case). You tried to reference e which is now out of scope giving you the problem.

    The query should be more like this I think:

    var fromDate = new DateTime(2012, 1, 1);
    var toDate = new DateTime(2012, 7, 1);
    var query = 
        from p in dc.Postings
        join e in dc.Employees on p.EmployeeId equals e.EmployeeId
        join j in dc.Jobs on p.JobCode equals j.JobCode
        join ce in dc.CentralTimeEmployees on e.EmployeeId equals ce.CtEmployeeId
        where (e.CostCentreId == 1 || e.CostCentreId == 3) // the SQL tested 1 or 3
           && (p.TransactionDate >= fromDate && p.TransactionDate <= toDate)
           && j.JobCode != "CTCIT00001"
           && ce.DatabaseCode == "CTL"
           && (ce.CostCentreId == 1 || ce.CostCentreId == 3)
        group new { ce.Hours, ce.LatestTimesheetEntry }
           by new { j.JobName, j.JobCode, e.ShortName } into g
        orderby g.Key.ShortName, g.Key.JobName
        select new
        {
            Name = g.Key.ShortName.Trim(),
            JobName = g.Key.JobName.Trim(),
            JobCode = g.Key.JobCode,
            Hours = g.Sum(x => x.Hours),
            LastTimeSubmitted = g.Max(x => x.LatestTimesheetEntry),
        };
    
    0 讨论(0)
提交回复
热议问题