1、代码如下:
var queryTemp = dbTable.Where(
x => x.Code == info.Code
&& x.Time >= minTime
&& x.Time <= maxTime)
.GroupBy(x => new { x.Code, x.Num })
.ToSql(x => new { Id = x.Max(x.Value.Id) }, FieldAliasOptions.AsProperty);
var inOutList = dbInOut.InnerJoin("(" + queryTemp + ") as b on a.id = b.Id ").ToList();
2、生成的SQL如下:
SELECT a.*
FROM [Test_202008] a
INNER JOIN (SELECT max(a.[Id]) Id
FROM [Test_202008] a
WHERE (a.[Code] = N'00120053014'
AND a.[Time] >= '2020-08-09 00:48:52.000'
AND a.[Time] <= '2020-08-09 12:58:22.000')
GROUP BY a.[MCode], a.[Num])
as b on a.id = b.Id
3、或者如下:
// 组装SQL
StringBuilder sbSql = new StringBuilder();
sbSql.Append(dbInOut.As("b").ToSql() + " where b.Id in (" + queryTemp + ")");
var inOutList = dbContext._freeSql.Ado.Query<Entity>(sbSql.ToString());
4、生成如下SQL
SELECT b.*
FROM [Test_202008] b
where b.id in (SELECT max(a.[Id]) Id
FROM [Test_202008] a
WHERE (a.[Code] = N'00120053014'
AND a.[Time] >= '2020-08-09 00:48:52.000'
AND a.[Time] <= '2020-08-09 12:58:22.000')
GROUP BY a.[MCode], a.[Num])