C# 如果值为null,如何返回空字符串

C# 如果值为null,如何返回空字符串,c#,entity-framework-6,C#,Entity Framework 6,我想在SomethingName为null时返回一个空字符串。植物。东西。名字!=无效的plants.Something.Name:string.Empty仍然会给我一个空指针。我已经调试了我的应用程序,知道这会导致NullPointerException 当我在数据库中为SomethingName设置数据时,我不会得到空指针异常 有没有更好的方法来处理这个问题 public FlowerMetaData GetLeafByFlowerId(int flowerId, string fl

我想在SomethingName为null时返回一个空字符串。植物。东西。名字!=无效的plants.Something.Name:string.Empty仍然会给我一个空指针。我已经调试了我的应用程序,知道这会导致NullPointerException

当我在数据库中为SomethingName设置数据时,我不会得到空指针异常

有没有更好的方法来处理这个问题

    public FlowerMetaData GetLeafByFlowerId(int flowerId, string flowerName)
    {
        _flowerContext = _contextUtility.GetFlowerContext(flowerName);

        var flowerData = (from flowers in _flowerContext.Flowers
                            where flowers.FlowerId == flowerId
                            join plants in _flowerContext.Plants on flowers.PlantId equals plants.PlantId
                            join leafs in _flowerContext.Leafs on flowers.LeafAk equals leafs.LeafAK
                            select new FlowerMetaData
                            {
                                PlantId = plants.PlantId,
                                PlantName = plants.PlantName,
                                FlowerName = FlowerName.ToUpper(),
                                FlowerNumber = leafs.FlowerNumber,
                                SomethingName = plants.Something.Name != null ? plants.Something.Name : string.Empty,
                                CreatedId = plants.CreatedId,
                            }).FirstOrDefault();

        return flowerData;
    }

StackTrace

    "Message": "An error has occurred.",
    "ExceptionMessage": "No flower found with id = 37.",
    "ExceptionType": "System.NullReferenceException",
    "StackTrace": "   at Flower.Services.FlowerService.GetLeafByFlowerId(Int32 flowerId, String flowerName)
at Flower.Controllers.Controllers.FlowerController.GetFlower(Int32 id, String client)\r\n   at lambda_method(Closure , Object , Object[] )
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
  at Sentinel.Services.AuthFilters.AddChallengeOnUnauthorizedResult.<ExecuteAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Controllers.AuthenticationFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}
未测试,但

SomethingName = plants.Something?.Name ?? string.empty
我们应该按要求去做。黛西说的

未测试,但

SomethingName = plants.Something?.Name ?? string.empty
我们应该按要求去做。黛西说的

通常,您可以使用来自C 6的,与来自C 2的空合并运算符相结合的方法,使这变得非常简单:

SomethingName = plants.Something?.Name ?? ""
表达式plants.Something?.Name将计算为null,而不是在plants.Something计算为null时引发异常。这个第二部分只是说,如果表达式的结果为null,则改用空字符串

如果plants本身可以为空,则可以使用:

SomethingName = plants?.Something?.Name ?? ""
。。。但在这种情况下,你不需要这样做

但是,有一个缺点:如果在LINQ提供程序中执行此操作,并且像LINQ to对象通常使用IQueryable而不是IEnumerable,则查询表达式的每个部分都将转换为表达式树,并且表达式树中不支持null条件运算符。因此,您可能需要在查询中执行投影,然后执行过程中的最后一部分。例如:

var entry = (from flowers in _flowerContext.Flowers
             where flowers.FlowerId == flowerId
             join plants in _flowerContext.Plants on flowers.PlantId equals plants.PlantId
             join leafs in _flowerContext.Leafs on flowers.LeafAk equals leafs.LeafAK
             select new { plants, leafs }).FirstOrDefault();
return entry == null 
    ? null // No entry in the database
    : new FlowerMetaData
      {
          PlantId = entry.plants.PlantId,
          PlantName = entry.plants.PlantName,
          FlowerName = FlowerName.ToUpper(),
          FlowerNumber = entry.leafs.FlowerNumber,
          SomethingName = entry.plants.Something?.Name ?? "",
          CreatedId = entry.plants.CreatedId,
       };
通常,您可以使用C 6中的,与C 2中的空合并运算符相结合的方法,使这变得非常简单:

SomethingName = plants.Something?.Name ?? ""
表达式plants.Something?.Name将计算为null,而不是在plants.Something计算为null时引发异常。这个第二部分只是说,如果表达式的结果为null,则改用空字符串

如果plants本身可以为空,则可以使用:

SomethingName = plants?.Something?.Name ?? ""
。。。但在这种情况下,你不需要这样做

但是,有一个缺点:如果在LINQ提供程序中执行此操作,并且像LINQ to对象通常使用IQueryable而不是IEnumerable,则查询表达式的每个部分都将转换为表达式树,并且表达式树中不支持null条件运算符。因此,您可能需要在查询中执行投影,然后执行过程中的最后一部分。例如:

var entry = (from flowers in _flowerContext.Flowers
             where flowers.FlowerId == flowerId
             join plants in _flowerContext.Plants on flowers.PlantId equals plants.PlantId
             join leafs in _flowerContext.Leafs on flowers.LeafAk equals leafs.LeafAK
             select new { plants, leafs }).FirstOrDefault();
return entry == null 
    ? null // No entry in the database
    : new FlowerMetaData
      {
          PlantId = entry.plants.PlantId,
          PlantName = entry.plants.PlantName,
          FlowerName = FlowerName.ToUpper(),
          FlowerNumber = entry.leafs.FlowerNumber,
          SomethingName = entry.plants.Something?.Name ?? "",
          CreatedId = entry.plants.CreatedId,
       };


SomethingName=植物。某物。名称??一串Empty@VacheC从那以后一直在前进post@PeterSmith但与您标识NRE源的方式不同。如果您可以提供您看到的堆栈跟踪,这将有助于确定这是否是正常的NRE。@DaisyShipton,我添加了堆栈跟踪,不确定它是否有帮助,但是谢谢你。SomethingName=植物。Something.Name??一串Empty@VacheC从那以后一直在前进post@PeterSmith但与您标识NRE源的方式不同。如果您可以提供您看到的堆栈跟踪,这将有助于确定这是否是正常的NRE。@DaisyShipton,我添加了堆栈跟踪,不确定它是否有帮助,但是谢谢你。如果某个东西不可为null,我该怎么办?@Maddy:然后是某个东西。Name不应该抛出NullReferenceException。Daisy已经解决了所有问题!如果某个东西不可为null,我该怎么办?@Maddy:那么,某个东西。Name不应该抛出NullReferenceException。Daisy已经解决了所有问题!如果plant或其他东西不可为null,我该怎么办。@Maddy:那么编译器将不允许您使用?,但您不会得到该部分的NullReferenceException,因为您不能取消对null值的引用。?。运算符不能在表达式树中使用。@IvanStoev:你完全正确。将进行编辑。@IvanStoev:现在看一看。如果plant或其他东西不可为null,我该怎么办。@Maddy:那么编译器将不允许您使用?,但您不会得到该部分的NullReferenceException,因为您不能取消对null值的引用。?。运算符不能在表达式树中使用。@IvanStoev:你完全正确。将编辑。@IvanStoev:现在看看。