【问题标题】:null issue during usage of count and sum LINQ使用 count 和 sum LINQ 期间的 null 问题
【发布时间】:2015-04-01 15:37:40
【问题描述】:

我有三个表,它们像链接一样链接

grandparent -> parent -> child 

categoryType - > Categories - > Menus

当我尝试运行时

return categoryTypes.Select(x =>
                     new CategoryTypeIndexModel
                     {
                         Id = x.Id,
                         Name = x.Name,
                         Categories = x.Categories.Count,
                         Items = x.Categories.Sum(m => m.Menus.Count())
                     });

我明白了

转换为值类型“System.Int32”失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可为空的类型。

【问题讨论】:

标签: c# linq lambda count sum


【解决方案1】:

您正在尝试计算类别为空时不存在的内容。 我相信 Habib 的建议在技术上是可行的,但事后你仍然需要考虑一个空值。 我认为更好的解决方案是直接在您的 linq 中通过查找 null 并提供默认值来解决它

return categoryTypes.Select(x => new CategoryTypeIndexModel
    {
        Id = x.Id,
        Name = x.Name,
        Categories = (x.Categories == null) ? 0 : x.Categories.Count,
        Items = (x.Categories == null) ? 0 : x.Categories.Sum(m => m.Menus.Count())
    });

如果 Menus 可能为 null,您还需要以类似的方式考虑这一点

【讨论】:

  • 当我尝试 Habib 的解决方案时,它显示无法将 lambda 表达式转换为类型“字符串”,因为它不是一个委托,当我尝试你的时,它在运行无法比较类型为“系统”的元素后给出以下错误。 Collections.Generic.ICollection`1[[Repository.edmx.Category, Repository, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'。仅支持原始类型、枚举类型和实体类型。
  • 我看到像我提到的那样检查 null 不会在 EF 中工作,除非你先枚举集合但是延迟加载等会变得更加复杂。在这种情况下,Habib 的解决方案是正确的,但你得到的错误让我认为 CategoryTypeIndexModel.Categories 是字符串类型?如果是这样,请将其更改为可为空的 int
  • Categories 是一个表格,而不是一个字段......我先将即将到来的结果转换为 IEnumerable,然后对其进行操作......感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2011-03-25
  • 2022-10-14
  • 2013-04-22
  • 2012-04-09
  • 2017-02-16
相关资源
最近更新 更多