记EfCore GroupBy翻译成Postgresql过程的错误
EfCoreGroupByTests 的测试总结
EfCoreGroupByTests文件中的三个测试用例,在SQLserver
中测试全部通过,在PostgreSQL
中测试部分通过。
query.GroupBy(q=>q.MonthDate.Value.ToString()).Select(q=> new{Key=q.Key==null?"":q.Key})
这种在GroupBy中进行了类型转换并且在Select中使用了条件表达式(三元条件运算符)的写法在PostgreSQL
环境下会报错。
TestGroupByWithNoConvertion_Test
EfCore代码:
var result = await dbSet
.Where(q => q.MonthDate != null)
.GroupBy(q => q.MonthDate.Value.ToString())
.Select(q => new {
Key = q.Key,
Count = q.Count()
})
.ToListAsync();
PostgreSQL
生成的SQL语句:
SELECT CAST(v."MonthDate" AS text) AS "Key", COUNT(*)::INT AS "Count"
FROM dbo.v_stats_grade_oper_complication_metrics AS v
WHERE (v."MonthDate" IS NOT NULL)
GROUP BY CAST(v."MonthDate" AS text)
结果:通过
TestGroupByWithConditionalOperator_Test
EfCore代码:
var result = await dbSet
.Where(q => q.MonthDate != null)
.GroupBy(q => q.MonthDate.Value.ToString())
.Select(q => new {
Key = q.Key == null ? "" : q.Key,
Count = q.Count()
})
.ToListAsync();
PostgreSQL
生成的SQL语句:
SELECT CASE
WHEN (v."MonthDate" IS NULL) THEN ''
ELSE CAST(v."MonthDate" AS text)
END AS "Key", COUNT(*)::INT AS "Count"
FROM dbo.v_stats_grade_oper_complication_metrics AS v
WHERE (v."MonthDate" IS NOT NULL)
GROUP BY CAST(v."MonthDate" AS text)
结果:未通过
Npgsql.PostgresException (0x80004005): 42803: 字段 "v.MonthDate" 必须出现在 GROUP BY 子句中或者在聚合函数中使用
TestGroupByWithConvertion_Test
EfCore代码:
var result = await dbSet
.Where(q => q.MonthDate != null)
.GroupBy(q => q.MonthDate.Value.ToString())
.Select(q => new {
Key = q.Key == null ? "" : DateTime.Parse(q.Key),
Count = q.Count()
})
.ToListAsync();
PostgreSQL
生成的SQL语句:
SELECT (v."MonthDate" IS NULL), CAST(v."MonthDate" AS text), COUNT(*)::INT
FROM dbo.v_stats_grade_oper_complication_metrics AS v
WHERE (v."MonthDate" IS NOT NULL)
GROUP BY CAST(v."MonthDate" AS text)
结果:未通过
Npgsql.PostgresException (0x80004005): 42803: 字段 "v.MonthDate" 必须出现在 GROUP BY 子句中或者在聚合函数中使用