【问题标题】:Handling null returns in new linq objects c#处理新 linq 对象中的空返回 c#
【发布时间】:2021-01-18 11:50:52
【问题描述】:

我要做什么?我需要将一个新创建的对象发布到数据库,传入的对象可能有一个空值。创建的对象在需要的地方设置为#nullible true

当数据进入并且我落在对象中的一个空字符串上时,我得到一个空引用并被捕获。

我的代码:

Objects.Data.Info.StoredData postData = new Objects.Data.Info.StoredData
                                {
                                    Name = data.data.Name,
                                    Type = data.data.Type,
                                    Price = data.data.Price,
                                    Indicator = data.data.Indicator,
                                    Scan = data.data.Scan,
                                    Comment = data.data.Extra
                                };
                                db.Information.Add(postData);
                                db.SaveChanges();

data.data.Extra 有时可以为空。

我通常会写 if 语句来解决这个问题,但不觉得这是最好的做法。我应该往哪个方向走?我检查了其他一些问题和 msdn,但找不到明确的路径。

谢谢。

【问题讨论】:

  • 这里有实际问题吗?您没有取消引用data.data.Extra,因此您不会从所显示的内容中获得 NRE。只要Comment 可以为空(属性和映射列),这应该 没问题。如果data.data 可以为空,那么您必须在访问Extra 属性(以及所有其他属性)之前进行一些测试。如果data.data.Extranull,你期待什么样的问题?请记住,#nullable 适用于代码,而不是对象。

标签: c# linq .net-core


【解决方案1】:

当属性为空时,您可以使用?? 运算符简洁地默认为空字符串,如下所示:

Comment = data.data.Extra ?? ""  
//the value on the right is used if the expression on the left is null

?? 被称为“空合并”运算符:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-coalescing-operator


如果您还想处理 null 的中间属性(我认为这不适用于这种情况,但很高兴知道),并且仍想默认为空字符串,您可以将其与 Eugene 的建议结合使用像这样使用?.

Comment = data?.data?.Extra ?? ""

?. 被称为“空条件”运算符:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-

【讨论】:

    【解决方案2】:
    var postData = new Objects.Data.Info.StoredData
                                    {
                                        Name = data.data.Name,
    
                                        Type = data.data.Type,
                                        Price = data.data?.Price,
                                        Indicator = data.data.Indicator,
                                        Scan = data.data.Scan,
                                        Comment = data.data.Extra
                                    };
                                    db.Entry(postData).State=EntityState.Added;
                                    db.SaveChanges();
    

    我认为您在使用 Price 属性时遇到了困难,因为一旦您的编程光标在那里失败,这个属性在您的数据库中不是 null,所以一旦您完全按照我所做的那样,最终您更改此可为空的,然后轻松检查或在运行时插入。

    【讨论】:

    • 如果你检查你的数据库然后你发现价格设置为非空,所以我只是让它不会立即返回空对象实例的错误
    • 你为什么使用data.data??肯定你有一对一或一对多的关系,但你的 linq 不能满足你问题的整个领域
    • 你只写和写只是为了证明如果错误是存在的,那么我认为基本问题的每一个地方都存在否认状态,不幸的是,不仅仅是你的受害者\
    • 我问你一个问题,如果没有你使用 Entityframework 那么你如何使用 db.SaveChanges()???
    • 如果data.datanull(正如您使用?. 检查),那么Name 赋值将在您的示例代码中抛出NullReferenceException
    【解决方案3】:

    您应该使用空条件运算符 (?.),如下所示:

    data?.data?.Name
    

    如果datadata.datanull,这将阻止NullReferenceException

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2010-12-13
      相关资源
      最近更新 更多