记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 子句中或者在聚合函数中使用

posted @ 2025-05-19 17:07  Theo·Chan  阅读(13)  评论(0)    收藏  举报