C# EF查询未按预期应用Where子句
我有一个用于EF6到SQL的查询。它通过患者Id过滤实体类型。但是,当我运行此代码时,它也包含来自其他患者的数据 我错过了什么 patientId是预期的过滤器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
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引用。但两种语言的运算符优先级规则是相同的。