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

C#中处理IQueryable.Union空引用异常,避免过多if/else

解决IQueryable Union时的Null引用异常问题

你的问题核心是null的IQueryable对象调用Union实例方法会触发空引用异常,而DefaultIfEmpty()无法解决这个问题——因为它只能作用于非null的序列,用来保证序列至少有一个元素,没法处理变量本身为null的情况。

下面提供几种无需大量if/else的简洁解决方案:

方案1:初始化时直接赋值空IQueryable

从根源避免变量为null,一开始就把两个查询对象初始化为空的可查询序列:

// 初始化为空的IQueryable,而非null
IQueryable<Container> containers1 = Enumerable.Empty<Container>().AsQueryable();
IQueryable<Container> containers2 = Enumerable.Empty<Container>().AsQueryable();

if (...condition1...)
{
  containers1 = containers.Where(...condition2...);
}
if (...condition3...)
{
  containers2 = containers.Where(...condition4...);
}

// 此时两个变量都非null,Union可安全执行
containers = containers1.Union(containers2);

方案2:使用null合并运算符(??)兜底

如果不想修改初始化逻辑,也可以在Union时用??将null替换为空序列:

IQueryable<Container> containers1 = null;
IQueryable<Container> containers2 = null;

if (...condition1...)
{
  containers1 = containers.Where(...condition2...);
}
if (...condition3...)
{
  containers2 = containers.Where(...condition4...);
}

// 用??把null替换为空的IQueryable,避免空引用
containers = (containers1 ?? Enumerable.Empty<Container>().AsQueryable())
             .Union(containers2 ?? Enumerable.Empty<Container>().AsQueryable());

补充说明

  • Union方法本身就会自动对结果去重,完全符合你获取去重容器列表的需求;
  • 如果你使用的是Entity Framework Core,也可以用dbContext.Set<Container>().AsQueryable().Take(0)来生成空序列,效果和Enumerable.Empty<Container>().AsQueryable()一致。

内容的提问来源于stack exchange,提问作者A. Gladkiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:45:08