使用LINQ查询不存在的记录时触发NullReferenceException问题求助
解决LINQ查询空记录时的NullReferenceException及代码问题
核心问题分析
FirstOrDefault()未找到匹配记录时返回null,直接访问fct.Factura_ID会触发NullReferenceException- 返回类型不匹配:
billfromid方法声明返回BillModel,但实际返回的是数据库实体或Bill类实例 - 属性名称不匹配:主窗体中访问的
bill.Numero/bill.Cliente与BillModel的Number/Customer属性不一致 using语句语法错误,大括号嵌套不正确
修正后的类代码
namespace Fallas { public class BillModel { public string Number { get; set; } public string Customer { get; set; } public decimal Subtotal { get; set; } public decimal Total { get; set; } } public static class Bill { public static BillModel billfromid(string number) { using (AppDatabase db = new AppDatabase()) { // 从数据库查询匹配记录,返回null表示未找到 var dbBill = db.vta_factura.FirstOrDefault(u => u.Numero == number); if (dbBill == null) { MessageBox.Show("Bill not found!", "Atencion!", MessageBoxButtons.OK, MessageBoxIcon.Information); // 返回空的BillModel避免主窗体空引用 return new BillModel(); } // 将数据库实体映射到BillModel返回 return new BillModel { Number = dbBill.Numero, Customer = dbBill.Cliente, Subtotal = dbBill.Subtotal, Total = dbBill.Total }; } } } }
修正后的主窗体代码
namespace Fallas { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void numerofactura_Leave(object sender, EventArgs e) { var bill = Bill.billfromid(billnumber.Text); // 处理返回的空BillModel,避免显示无效内容 if (!string.IsNullOrEmpty(bill.Number)) { numerofactura.Text = bill.Number; nombrecliente.Text = bill.Customer; } else { numerofactura.Text = string.Empty; nombrecliente.Text = string.Empty; } } } }
关键修改说明
- 空值判断:先检查
dbBill == null,彻底避免访问null对象属性引发的异常 - 类型匹配:严格按照方法声明的返回类型
BillModel返回实例,完成数据库实体到模型类的属性映射 - 属性对齐:主窗体中使用
BillModel的正确属性名Number和Customer - 语法修正:修正
using语句的大括号嵌套错误,保证资源正确释放 - 容错处理:主窗体增加对空模型的处理,清空输入框提示用户操作结果
内容的提问来源于stack exchange,提问作者jebus
相关产品推荐
相关产品推荐

