Asp.Net Core 6多条件查询DatabaseContext时遇空引用错误求助
问题描述
本人使用Asp.Net Core 6、C#开发应用,以下单条件查询代码执行无问题:
var vName = DatabaseContext.Venue.FirstOrDefault(m => m.Name == viewModel.Name).Name;
以下多条件查询代码执行也无问题:
var vcEmail = DatabaseContext.VenueContact.FirstOrDefault( m => m.VenueId == viewModel.Id && m.ContactEmail == viewModel.ContactEmail);
但执行如下多条件查询代码时,出现错误**“Object reference not set to an instance of an object”**:
var vcName = DatabaseContext.VenueContact.FirstOrDefault( m => m.VenueId == viewModel.Id && m.Display == vcDisplay).Display;
已知vcDisplay为有效值,Display字段存在于数据表/模型中,viewModel.Id也有效(已在之前语句中使用)。错误码:_HResult=-2147467261,_COMPlusExceptionCode=-532462766。
请问如何排查该错误?是否多条件查询无法直接返回字段值?
问题排查与解决
- 错误本质:
FirstOrDefault在没有匹配到任何数据时会返回null,此时直接访问.Display就会触发空引用异常。你之前的查询没报错,只是刚好都查到了数据,和是否多条件无关。 - 排查步骤:
- 拆分查询和字段访问:先单独执行查询,通过调试查看结果是否为
null:
如果var venueContact = DatabaseContext.VenueContact.FirstOrDefault( m => m.VenueId == viewModel.Id && m.Display == vcDisplay);venueContact是null,说明数据库里没有符合这两个条件的记录。 - 核对条件匹配细节:检查
vcDisplay与Display字段的类型、格式是否完全一致,比如字符串是否区分大小写、是否有多余空格,数值类型是否精度匹配,这些都可能导致查不到数据。 - 直接在数据库验证:执行对应SQL语句,确认是否存在目标记录:
SELECT * FROM VenueContact WHERE VenueId = @Id AND Display = @vcDisplay;
- 拆分查询和字段访问:先单独执行查询,通过调试查看结果是否为
- 解决办法:
- 先判空再访问字段:
var venueContact = DatabaseContext.VenueContact.FirstOrDefault( m => m.VenueId == viewModel.Id && m.Display == vcDisplay); var vcName = venueContact?.Display; // 使用空安全运算符避免空引用 - 若预期必须有数据,改用
First:查不到时会抛出明确的异常,方便定位问题:var vcName = DatabaseContext.VenueContact.First( m => m.VenueId == viewModel.Id && m.Display == vcDisplay).Display; - 用空合并运算符设置默认值:
var vcName = DatabaseContext.VenueContact.FirstOrDefault( m => m.VenueId == viewModel.Id && m.Display == vcDisplay)?.Display ?? string.Empty;
- 先判空再访问字段:
内容的提问来源于stack exchange,提问作者Nestor
相关产品推荐
相关产品推荐

