SQL到LINQ C#以及join max和group
如何在LINQ中编写以下查询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)
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,