Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当存在零/空条目时,如何处理对一对多(或零)实体的迭代?_C#_Linq_Entity Framework Core - Fatal编程技术网

C# 当存在零/空条目时,如何处理对一对多(或零)实体的迭代?

C# 当存在零/空条目时,如何处理对一对多(或零)实体的迭代?,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我不断得到NullReferenceException试图迭代行上的空条目 public class Person { public int ID { get; set; } public string Name { get; set; } public Address Address { get; set; } public int AddressID { get; set; } } public class A

我不断得到
NullReferenceException
试图迭代行上的空条目

public class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public Address Address { get; set; }
        public int AddressID { get; set; }
    }

public class Address
    {
        public int ID { get; set; }
        public string FirstLine { get; set; }
        public string SecondLine { get; set; }
    }
使用默认的scaffold模板,
\u context.Person.Include(c=>c.Address)

如果有地址或没有地址,视图工作正常

然而,我现在用一个新的网格替换默认的索引页面,该网格通过带有过滤和分页机制的AJAX加载。为此,我需要将数据转换为我的ViewModel

我希望能够以文本的形式在行中显示地址。我尝试了以下方法:

        var tmp = _context.Person.Include(x => x.Address).ToList();

        tmp.ForEach(x => vm.List.Add(new IndexListItem()
        {
            Name = x.Name,
            Address = x.Address.FirstLine + " " + x.Address.SecondLine,
            ID = x.ID

        }));
但是,在调试时,地址似乎总是空的,即使行中有数据

我很确定我可以在一个标准的foreach循环上完成这项工作,并进行if null检查,但是,我忍不住觉得这是一件非常简单的事情,我把它复杂化了


有没有更简单的方法来返回我需要的地址详细信息?

你能试试这样的地址吗:

Address = x.Address?.FirstLine + " " + x.Address?.SecondLine, 
如果不需要空白,请尝试以下操作:

Address = x.Address == null ? null : (x.Address.FirstLine + " " + x.Address.SecondLine), 

你能试试这样的地址吗:

Address = x.Address?.FirstLine + " " + x.Address?.SecondLine, 
如果不需要空白,请尝试以下操作:

Address = x.Address == null ? null : (x.Address.FirstLine + " " + x.Address.SecondLine), 

正如我在评论中所说,你应该在一份声明中这样做:

vm.List = _context.Person
    .Select(p => new IndexListItem
    {
        Name = p.Name,
        Address = p.Address.FirstLine + " " + p.Address.SecondLine,
        ID = p.ID
    }).ToList();
这有两个好处:

  • 它被转换为SQL,因此只从数据库中提取四个必填字段(这与更广泛的记录有很大区别)
  • EF将生成考虑空值的SQL
  • 如果您不希望结果是
    ,您可以这样做

    Address = (p.Address.FirstLine + " " + p.Address.SecondLine).Trim()
    
    ……或者

    Address = p.Address.FirstLine != null ? p.Address.FirstLine + " " : "")
        + p.Address.SecondLine
    

    但我认为这对查看数据没有多大关系。

    正如我在评论中所说,你应该在一句话中这样做:

    vm.List = _context.Person
        .Select(p => new IndexListItem
        {
            Name = p.Name,
            Address = p.Address.FirstLine + " " + p.Address.SecondLine,
            ID = p.ID
        }).ToList();
    
    这有两个好处:

  • 它被转换为SQL,因此只从数据库中提取四个必填字段(这与更广泛的记录有很大区别)
  • EF将生成考虑空值的SQL
  • 如果您不希望结果是
    ,您可以这样做

    Address = (p.Address.FirstLine + " " + p.Address.SecondLine).Trim()
    
    ……或者

    Address = p.Address.FirstLine != null ? p.Address.FirstLine + " " : "")
        + p.Address.SecondLine
    

    但我认为查看数据并不重要。

    同一查询在两种情况下的行为不一样似乎是不可能的。但是请注意,通过
    \u context.Person.Select(p=>newindexlistitem{Name=p.Name,Address=p.Address.FirstLine+“”+p.Address.SecondLine,…)直接投影到视图模型要高效得多
    .Hi Gert,如果我不清楚,很抱歉-使用默认的scaffold视图/控制器,我从不在视图处理地址之前尝试枚举地址。只有在我修改地址并尝试将其放入字符串后,我才出现错误。我猜这是因为我已经调用了tolist或类似功能。但也感谢您的评论。我仍然是v非常多的新手和性能/最佳实践是我真正想更好地理解的(在我学会如何实际工作之后!!)你能试试这样的地址吗:address=x.address?.FirstLine+“”+x.address?.SecondLine,我想这很清楚。只是部分
    \u context.Person.Include(c=>c.address)
    似乎没有改变,这应该总是做同样的事情。@sriharsha-我觉得自己像个傻瓜-我不知道你这样调用可空字符串来消除错误…效果很好-请随意将其作为答案…如果你能告诉我如何消除空白/只有在有问题时才显示它,你就可以获得额外的分数我需要从左边分开!(但在视图中可能会这样做…)似乎不可能在两种情况下相同的查询表现不同。但是请注意,通过
    \u context.Person.Select(p=>newindexlistem{Name=p.Name,Address=p.Address.FirstLine+”直接投影到视图模型要高效得多+p.Address.SecondLine,…}
    .Hi Gert,如果我不清楚,很抱歉-使用默认的scaffold视图/控制器,我从不在视图处理地址之前尝试枚举地址。只有在我修改地址并尝试将其放入字符串后,我才出现错误。我猜这是因为我已经调用了tolist或类似功能。但也感谢您的评论。我仍然是v非常多的新手和性能/最佳实践是我真正想更好地理解的(在我学会如何实际工作之后!!)你能试试这样的地址吗:address=x.address?.FirstLine+“”+x.address?.SecondLine,我想这很清楚。只是部分
    \u context.Person.Include(c=>c.address)
    似乎没有改变,这应该总是做同样的事情。@sriharsha-我觉得自己像个傻瓜-我不知道你这样调用可空字符串来消除错误…效果很好-请随意将其作为答案…如果你能告诉我如何消除空白/只有在有问题时才显示它,你就可以获得额外的分数我需要分开到它的左边!(但可能会在视图中这样做…)谢谢-好的,所以,我现在完全理解发生了什么以及为什么(这篇文章上的另一个答案修复了它,但另一个问题详细说明了问题)…这个答案对性能很好,但是,没有解决这个问题(如果您可以编辑/执行地址?-我可以标记为答案,性能提升是一个额外的奖励!)但是…我也很好奇是否有任何语法可以在一行上返回null/删除select函数中的空白?我尝试了'x.Address?.FirstLine+x.Address??x.Address:null'和其他一些没有运气的语法:(我不知道你所说的“如果你能编辑/做地址”是什么意思,但这里有另一种方法可以在一行中有条件地添加空格(某种程度上)。没有其他/更短的选项。谢谢-好的,所以我现在完全理解了发生了什么以及为什么(这篇文章的另一个答案解决了这个问题,但另一个问题会详细说明问题)…这个答案对性能很好,但是,没有解决问题(如果您可以编辑/执行地址?-我可以标记为答案,而性能b