我有一个我正在使用EF6到SQL的查询。它通过患者Id过滤实体类型。但是,当我运行此代码时,它也包含来自其他患者的数据。
我错过了什么?
patientId是预期的过滤器。
var res = (from p in context.ManualMetricEntries.Include("ManualMetricValues")
from q in p.ManualMetricValues
where p.PatientId == patientId &&
q.ManualMetricTypeId == readingType ||
q.ManualMetricTypeId == readingType2
orderby p.EntryDate descending
select p).Take(readingcount).ToList();
答案 0 :(得分:3)
你刚刚在where子句中遗漏了一些括号:
var res = (from p in context.ManualMetricEntries.Include("ManualMetricValues")
from q in p.ManualMetricValues
where p.PatientId == patientId &&
(q.ManualMetricTypeId == readingType ||
q.ManualMetricTypeId == readingType2)
orderby p.EntryDate descending
select p).Take(readingcount).ToList();
答案 1 :(得分:3)
我认为这是逻辑运算符优先级的问题。 In C# the conditional AND (&&) has precedence over the conditional OR (||),因此您的where
表达式与此相同:
where (p.PatientId == patientId && q.ManualMetricTypeId == readingType) ||
q.ManualMetricTypeId == readingType2
但你真的想要这个:
where p.PatientId == patientId &&
(q.ManualMetricTypeId == readingType || q.ManualMetricTypeId == readingType2)
您必须明确编写括号以覆盖默认优先级。
答案 2 :(得分:2)
你忘记了隐含的括号。你的where子句写成:
where p.PatientId == patientId &&
q.ManualMetricTypeId == readingType ||
q.ManualMetricTypeId == readingType2
由于逻辑AND优先于逻辑OR,因此您的语句等同于
where (p.PatientId == patientId && q.ManualMetricTypeId == readingType) ||
(q.ManualMetricTypeId == readingType2)
您要做的是将括号明确地放在
中where (p.PatientId == patientId) &&
(q.ManualMetricTypeId == readingType || q.ManualMetricTypeId == readingType2)