【发布时间】:2021-03-15 10:53:00
【问题描述】:
我一直在尝试将下面的 sql 查询转换为 linq:
SELECT
Table1.Id1,
Table2.Id2,
MAX(Table3.DateField) AS MaxDateField
FROM
Table1
INNER JOIN
Table2 ON Table1.Id1 = Table2.FK1
LEFT OUTER JOIN
Table3 ON Table2.Id2 = Table3.FK2
GROUP BY
Table1.Id1, Table2.Id2
Table1/Table2的关系是一对多,Table2/Table3也是一对多。
SQL 工作正常,对于 Table1 和 Table2 的每条记录,只提供来自 Table3 的一条记录。
对于我尝试过的 linq:
var query = from table1 in tables1
join table2 in tables2 on table1.Id1 equals table2.FK1
join table3 in tables3 on table2.Id2 equals table3.FK2 into JoinedTable3Table2
from table3 in JoinedTable3Table2.DefaultIfEmpty()
group new {
table3.MyDateField
}
by new {
table1.Id1,
table2.Id2,
table3.MyDateField
}
into g
select new MyModel {
Field1 = g.Key.Id1,
Field2 = g.Key.Id2,
Field3 = g.Max(d => d.MyDateField)
};
但这会为 Table1 和 Table2 中的每条记录从 Table3 中返回 n 条记录。
然后我尝试了(正如 Svyatoslav Danyliv 建议的那样):
var query = from table1 in tables1
join table2 in tables2 on table1.Id1 equals table2.FK1
join table3 in tables3 on table2.Id2 equals table3.FK2 into JoinedTable3Table2
from table3 in JoinedTable3Table2.DefaultIfEmpty()
group new {
table1.Id1,
table2.Id2
}
by new {
table1.Id1,
table2.Id2,
table3.MyDateField
}
into g
select new MyModel {
Field1 = g.Key.Id1,
Field2 = g.Key.Id2,
Field3 = g.Max(d => d.MyDateField)
};
然后我在Field3 = g.Max(d => d.MyDateField) 收到错误(CS 1061:匿名类型)
【问题讨论】:
标签: c# sql sql-server linq