ASP.NET MVC Entity Framework传字符串查库返回空值问题求助
排查订单号查询返回空值的问题
我来帮你一步步梳理这个返回空值的问题,这种情况大多是几个常见原因导致的,咱们逐个排查:
大小写不匹配:如果你的数据库(比如PostgreSQL)默认区分大小写,或者
order_no字段设置了区分大小写的排序规则,那传入的字符串大小写和数据库存储的不一致就会查不到结果。可以改用不区分大小写的比较方式:var result = db.orders .Where(or => or.order_no.Equals(or_n, StringComparison.OrdinalIgnoreCase)) .FirstOrDefault();前后空格干扰:有时候订单号在数据库里或者传入参数时带有看不见的前后空格,比如数据库里是
"ORD001 ",但你传入的是"ORD001",直接比较就会不相等。可以先对两边的值做去空格处理:var cleanOrN = or_n?.Trim() ?? string.Empty; var result = db.orders .Where(or => or.order_no?.Trim() == cleanOrN) .FirstOrDefault();数据库上下文缓存/追踪问题:EF的上下文会追踪已加载的实体,有时候可能会影响查询结果。可以尝试关闭追踪来排除这个问题:
var result = db.orders.AsNoTracking() .Where(or => or.order_no == or_n) .FirstOrDefault();连接的数据库不对:检查一下你的
foodorderingEntities对应的连接字符串,确认是不是指向了你预期的数据库,并且该数据库中确实存在对应order_no的订单数据。数据类型不匹配:确认数据库里的
order_no字段类型和你传入的字符串类型一致,比如如果数据库里是整数类型,那字符串比较肯定不会匹配(不过这种情况编译时大概率会报错,但还是建议核对一下)。
调试小技巧
在代码里先打印传入的or_n值,然后直接在数据库中执行SQL查询验证:
SELECT * FROM orders WHERE order_no = '你传入的订单号'
如果SQL能查到数据但代码查不到,那就是代码里的比较逻辑有问题;如果SQL也查不到,那就是数据库里确实没有这条数据,或者订单号输入错误。
修改后的示例代码
结合去空格和不区分大小写的处理,代码可以改成这样:
order getCustomerOrder(string or_n) { using (foodorderingEntities db = new foodorderingEntities()) { var cleanOrN = or_n?.Trim() ?? string.Empty; var result = db.orders .Where(or => or.order_no?.Trim().Equals(cleanOrN, StringComparison.OrdinalIgnoreCase) == true) .FirstOrDefault(); return result; } }
内容的提问来源于stack exchange,提问作者Anis ul Hassan
相关产品推荐
相关产品推荐

