【问题标题】:How best to handle null objects in LINQ expressions如何最好地处理 LINQ 表达式中的空对象
【发布时间】:2021-11-04 13:45:38
【问题描述】:
var TravelRoute = MyData.TravelRouteByName(
         parameters.Directions
                   .Where(p => p.TravelRouteId != null)
                   .Select(p => p.TravelRouteId.Value)
                   .Distinct()
                   .ToArray());

我有上面的示例 linq 查询。如果 Directions 为 null,则会通过异常“”

值不能为空。\r\n参数名称:源

在不引发异常的情况下处理这种情况的最佳方法是什么?

【问题讨论】:

  • Null-conditional operatorsif(parameters.Directions != null) { var TravelRoute = MyData.TravelRouteByName(parameters.Directions.Where...
  • @vernou 我希望在 if 语句之外声明 var TravelRoute,但是当我这样做时,它会抱怨“无法将 null 分配给隐式类型变量”
  • @StackTrace 在这种情况下,您必须使用显式类型声明变量。 (TravelRoute TravelRoute = null;)
  • @StackTrace 不要将所有内容放在一行中。在这种情况下,LINQ 查询没有理由与MyData.TravelRouteByName 在同一行。如果将该表达式提取到单独的行中,那么在执行查询之前检查Directions 是否为空就变得很简单了。 if (parameters.Directions != null){ var values=parameters.Directions.Where(....); var TravelRoute=MyData.TrravelRouteByName(values);...}
  • 如果Directions 为空,MyData.TravelRouteByName 应该怎么做?该方法的其余部分是做什么的?也许您应该在方法开始之前验证parametersDirections,然后再继续

标签: c# linq


【解决方案1】:

这不仅仅是 linq 的问题,在您的示例中,它可能只是您注意到 Directions 为空的第一个地方。您可以使用空条件运算符?.Directions?.Where(...),而不是Directions.Where(...)。这样,您的链式调用中就不会再执行任何方法,并且您将得到 null 作为 TravelRouteByName 方法的参数。

另一种方法(我个人更喜欢)是完全远离空值,随着 C# 8 的发布,这变得容易多了:How to enable Nullable Reference Types feature of C# 8.0 for the whole project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多