C# EF查询未按预期应用Where子句

C# EF查询未按预期应用Where子句,c#,entity-framework,C#,Entity Framework,我有一个用于EF6到SQL的查询。它通过患者Id过滤实体类型。但是,当我运行此代码时,它也包含来自其他患者的数据 我错过了什么 patientId是预期的过滤器 var res = (from p in context.ManualMetricEntries.Include("ManualMetricValues") from q in p.ManualMetricValues where p.Patie

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

您只是缺少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();

我认为这是一个逻辑运算符优先的问题,所以你的where表达式等价于:

where (p.PatientId == patientId && q.ManualMetricTypeId == readingType) ||
    q.ManualMetricTypeId == readingType2
但实际上你想要这个:

where p.PatientId == patientId &&
    (q.ManualMetricTypeId == readingType || q.ManualMetricTypeId == readingType2)

必须显式写入括号以覆盖默认优先级。

您忘记了隐含括号的位置。您的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)

谢谢你的莫名其妙的否决票…所有的答案都很好,但这一个解释和引用了原因。谢谢值得一提的是,SQL在处理OR和时使用相同的运算符优先级,因此这不是C或EF问题,而是OP问题。@GrantH:我已将链接更改为C引用。我无意中链接了一个C引用。但两种语言的运算符优先级规则是相同的。