SQL到LINQ C#以及join max和group

SQL到LINQ C#以及join max和group,c#,sql,linq,C#,Sql,Linq,如何在LINQ中编写以下查询 select a.IntId, Max(b.CreateDate), Max(a.TwoID) from TableA a join TableB b on a.IntId = b.IntId group by IntId 我现在有这个,但不起作用: var res = DbContext.TableA .Include(c => c.TableB)

如何在LINQ中编写以下查询

select 
    a.IntId, Max(b.CreateDate), Max(a.TwoID) 
from 
    TableA a 
join 
    TableB b on a.IntId = b.IntId 
group by 
    IntId
我现在有这个,但不起作用:

var res = DbContext.TableA
                   .Include(c => c.TableB)
                   .Select(p => new { CreateDate = p.TableA.CreateDate, IntId = p.IntId, TwoID = p.TwoID })
                   .GroupBy(x => x.IntId)
                   .Select(grp => grp.OrderByDescending(x => x.CreateDate)
                   .First()).ToList();

您的标识符不是很有意义。您这样做可能是为了回答这个问题,但这使得理解
TableA
TableB
之间的关系变得相当困难

在我看来,TableA和TableB之间有一种一对多的关系:TableB中的每一行都有TableA中的零行或多行;表A中的每一行“属于”表B中的一行,即外键
IntId
所指的行

从每个带有TableA项目的
TableB行
,您要获取属于此TableB的所有TableA行中的
TableB.IntId
TableB.CreateDate
和最大的
TableA.TwoId

每当你需要从一个到多个关系中提取“子项目”,比如学校与学生,客户与他们的订单,或“Table B行与表列”,考虑使用一个重载。 因为我不只是想要一些特殊的结果,而不仅仅是“TableB行及其TableA行”,所以我使用带有参数resultSelector的重载:

IQueryable<TableARow> tableA = ...
IQueryable<TableBRow> tableB = ...

var result = tableB.GroupJoin(tableA,   // GroupJoin TableB with TableA

    tableBRow => tableBRow.IntId,       // from every row in tableB take the IntId
    tableARow => tableARow.IntId,       // from every row in tableA take the foreign key

    // parameter resultSelector: from every row in tableB, with its zero or more 
    // matching rows from tableA, make one new object:
    (tableBRow, matchingTableARows) => new
    {
        IntId = tableBRow.IntId,
        CreateDate = tableBRow.CreateDate,

        LargestTwoId = matchingTableARows.Select(tableARow => tableARow.TwoId).Max(),
    })
或:

这篇文章可能会帮助你:“不起作用”是什么意思?您使用哪种类型的LINQ?EF/EF core,其他一些O/R映射器,以及哪个版本?
LargestTwoId = matchingTableARows.Select(tableARow => tableARow.TwoId)
    .OrderByDescending(twoId => twoId)
    .FirstOrDefault(),
LargestTwoId = matchingTableARows.Any() ?
   matchingTableARows.Select(tableARow => tableARow.TwoId).Max() :
   null,