You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
            }
        }
    }
}

关键修改说明

  1. 空值判断:先检查dbBill == null,彻底避免访问null对象属性引发的异常
  2. 类型匹配:严格按照方法声明的返回类型BillModel返回实例,完成数据库实体到模型类的属性映射
  3. 属性对齐:主窗体中使用BillModel的正确属性名Number和Customer
  4. 语法修正:修正using语句的大括号嵌套错误,保证资源正确释放
  5. 容错处理:主窗体增加对空模型的处理,清空输入框提示用户操作结果

内容的提问来源于stack exchange,提问作者jebus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:11:28