我有以下简单的查询:
var students = from s in dbContext.Students
select new
{
Name = s.Name,
HasGrades = s.Grades.Where(x => x.IsActive).Count() == 1
};
列HasGrades
是布尔值,只有当学生正好存在一个活动分数时,才必须显示为true.
我有点困惑为什么EF Core将其翻译成两个子查询,并额外判断COUNT(*)
个结果与null?Postgr COUNT(*)
永远不会返回null:
SELECT
s."NAME" AS "Name",
((SELECT COUNT(*)::INT
FROM "GRADES" AS p0
WHERE (s."NAME" = p0."NAME") AND p0."IS_ACTIVE") = 1)
AND (((SELECT COUNT(*)::INT
FROM "GRADES" AS p0
WHERE (s."NAME" = p0."NAME") AND p0."IS_ACTIVE") IS NOT NULL)) AS "HasGrades"
FROM
"STUDENTS" AS s
最新情况:
如果我改变这条线
HasGrades = s.Grades.Where(x => x.IsActive).Count() == 1
对此:
HasGrades = s.Grades.Where(x => x.IsActive).Count() == 1 ? true : false
那么它就被翻译成
CASE
WHEN (
SELECT COUNT(*)::INT
FROM "GRADES" AS p1
WHERE (p."NAME" = p1."NAME") AND p1."IS_ACTIVE") = 1 THEN TRUE
ELSE FALSE
END
看起来这是一个更好的结果