C# Web API用LINQ查MySQL多条件报CS0019错误的正确写法
CS0019报错原因与正确查询实现
报错根因
编译错误CS0019是因为Where里的Lambda条件表达式写法不合法:逻辑与运算符&&要求两侧的操作数都必须返回布尔值(bool),你的代码里&&某一侧的表达式返回了string类型,通常是以下几种笔误导致:
- 把城市字段的相等判断
==误写为赋值运算符=,赋值表达式返回的是被赋值的字符串本身 - 漏写城市字段的判断逻辑,直接把字符串类型的City字段放在
&&操作数位置 - 括号匹配错误导致表达式运算优先级错乱,字符串字段被直接作为
&&的操作数
前置约定
以下写法基于常规实体配置:
Person实体包含整型薪资字段Salary- 若地址信息独立存储:
Person持有Address类型的导航属性,Address实体包含字符串类型的城市字段City - 方法入参为
int salaryThreshold(用户传入的薪资阈值)、string targetCity(用户传入的目标查询城市)
正确查询写法
场景1:Person表直接存储City字段(无地址关联表)
var result = _context.Persons .Where(p => p.Salary > salaryThreshold && p.City == targetCity) .ToList();
场景2:City字段存在关联的Address表中
如果返回结果需要附带地址信息,添加Include加载导航属性即可,仅做过滤时可以省略:
var result = _context.Persons .Include(p => p.Address) // 需引入Microsoft.EntityFrameworkCore命名空间 .Where(p => p.Salary > salaryThreshold && p.Address.City == targetCity) .ToList();
注意事项
- 字符串比较默认使用数据库配置的排序规则,如果需要忽略大小写匹配,优先通过MySQL排序规则配置实现,不要在LINQ中调用
ToLower()/ToUpper()等方法,否则会触发全表扫描影响查询性能 - 所有过滤逻辑会被EF Core转换成对应SQL下推到MySQL执行,不会加载全表数据到内存做过滤
内容的提问来源于stack exchange,提问作者Mikethesuspectprogrammer
相关产品推荐
相关产品推荐

