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
相关产品推荐
相关产品推荐

