【问题标题】:Creating DTOs using select conditionally有条件地使用 select 创建 DTO
【发布时间】:2019-11-19 03:41:18
【问题描述】:

我有一个以下方式的 Linq 查询,如果某个值在 from 中变为 null,则避免选择,如果它不为 null 或有值,则只进行选择,在下面的查询中,只有在 vv 时才会发生选择不为空,并且正在选择的项目不应为空

var Violations = from vv in n.Violations
select new
{
    ViolationNumber = vv.ViolationNumber,
    ViolationId = vv.ViolationId,
    inspectionItemNum = (inspectionItems != null && inspectionItems.Count() > 0)
        ? (from i in inspectionItems
           where i.Violations.Any(v => v.ViolationId == vv.ViolationId)
           select i.InspectionItemNumber)
        : null
}

所以在上面的Linq查询中,如果vv变为null,如果vv变为null,它应该只返回null,我不想执行select new,因为它会抛出异常,我该如何处理C#中的情况,有什么帮助吗? - 非常感谢。

【问题讨论】:

  • 这不是看inspectionItems 是什么,一个查询,一个列表,....考虑使用Join 而不是这个“Any”。你的 ViolationId 不是唯一的吗?您是否希望每个 Table 有多个 ID? “查找”可能比“任何”更合适。
  • 您能否澄清一下:如果 Violation 不在inspectionItems Violations 集合中(以及在n.Violations 中),您是否希望新集合中有一个空条目?

标签: c# .net


【解决方案1】:

所以在上面的 Linq 查询中,如果 vv 变为 null,(...) 它应该只返回 null

回答注释,可以在select中使用三元运算符(保留结果中的空值):

var Violations = from vv in n.Violations
          select vv != null
               ? new { /* ... */ }
               : null;

...或者如果您想过滤掉为空的 vv:

var Violations = from vv in n.Violations
          where vv != null
          select new { /* ... */ }; 

老答案(好像我没有正确理解你)

如果我理解正确,只有当n.Violations 不为空时,您才能进行选择:

var Violations = n != null && n.Violations != null
        ? from vv in n.Violations
          select new { /* ... */ }
        : null; 

【讨论】:

  • 对不起,如何检查 vv 本身是否为空?将 vv 设为 null,请问有什么选择吗?
  • 我已经更新了答案。写下我没有考虑过列表中存在的null 元素的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多