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