【发布时间】:2021-07-28 09:03:17
【问题描述】:
我有这段执行 SQL 左连接操作的 C# 代码(使用 EF Core 3.1)。
var groupedQuery = query.GroupBy(x => x.CreatedTime.Date)
.Select(o => new
{
Date = o.Key,
Count = o.Count()
});
var acceptedGroupedQuery = query.Where(o => o.Accepted).GroupBy(x => x.CreatedTime.Date)
.Select(o => new
{
Date = o.Key,
Count = o.Count()
});
var projectedQuery = groupedQuery.GroupJoin(acceptedGroupedQuery, o => o.Date, i => i.Date,
(o, i) => new { Total = o, Accepted = i })
.SelectMany(o => o.Accepted.DefaultIfEmpty(), (joined, accepted) => new
{
Date = joined.Total.Date,
Total = joined.Total.Count,
Accepted = accepted.Count
});
var result = await projectedQuery
.Skip(model.Skip).Take(model.Take).ToArrayAsync(cancellationToken: cancellationToken);
对应的SQL生成是
exec sp_executesql N'SELECT [t].[c] AS [Date], CAST([t].[c0] AS float) AS [Total], CAST([t0].[c0] AS float) AS [Accepted]
FROM (
SELECT CONVERT(date, [p].[CreatedTime]) AS [c], COUNT(*) AS [c0]
FROM [PartnerInvitation] AS [p]
WHERE [p].[DeletedTime] IS NULL
GROUP BY CONVERT(date, [p].[CreatedTime])
) AS [t]
LEFT JOIN (
SELECT CONVERT(date, [p0].[CreatedTime]) AS [c], [t].[c0]
FROM [PartnerInvitation] AS [p0]
WHERE [p0].[Accepted] = 1
GROUP BY CONVERT(date, [p0].[CreatedTime])
) AS [t0] ON [t].[c] = [t0].[c]
ORDER BY (SELECT 1)
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=10
上述查询给出以下错误:
消息 4104,级别 16,状态 1,第 9 行。无法绑定多部分标识符“t.c0”。
我希望左连接中的第二个选择语句是 SELECT ..., COUNT(*) as [c0] 而不是 SELECT ..., t.[c0]
知道这里发生了什么以及如何解决吗?
【问题讨论】:
-
看来是个bug
-
我在此处的 EF Core 存储库中发布了一个问题:#24847
-
@TrầnNamTrung 因为它已经修复(见我的回答),他们应该知道它,所以发布一个新问题无济于事 - 很可能它会作为重复的东西被关闭。
标签: c# sql-server entity-framework-core ef-core-3.1