EF查询不适用于预期的子句

时间:2014-01-02 21:20:00

标签: c# entity-framework

我有一个我正在使用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();

3 个答案:

答案 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)