来自DataTable Enumeration的LINQ没有产生任何结果

时间:2014-02-10 09:18:32

标签: c# linq

我有以下声明,当我运行它时,我得到了

枚举没有产生结果

 var striko4goodproduct = from myrow in GoodProduct.AsEnumerable()
                          where myrow.Field<string>("MachineID") == "Striko 4"
                          group myrow by myrow.Field<string>("MachineID") == "Striko 4" into g
                          select new
                          {
                            TotalGood = g.Sum(x => x.Field<int?>("VIngot") ??
                                                   0 + x.Field<int?>("Heads") ??
                                                   0 + x.Field<int?>("Risers") ?? 0)
                          };

是否可以让它返回0而不是此消息?

有时数据库中会有值,有时则可能没有。

我试图在运行后执行以下操作并为其分配值。

if (striko4goodproduct.Equals(null))
{

}

3 个答案:

答案 0 :(得分:3)

Enumeration yielded no results是一个调试器消息,它不是你在运行时会看到的,所以我不会真正关心它。

只检查查询是否返回了任何结果

if (striko4goodproduct.Any())
{
    ...
}

答案 1 :(得分:2)

您可以使用DefaultIfEmpty

  

如果序列为空,则返回指定序列的元素或单例集合中的指定值。

所以你正在寻找类似的东西(注意我删除了匿名类型):

var striko4goodproduct = (from myrow in GoodProduct.AsEnumerable()
                          ...).DefaultIfEmpty(0);

这样,如果内部查询没有返回结果,DefaultIfEmpty确保至少有一个元素(0)。


请注意,if (striko4goodproduct.Equals(null))无效。 linq查询永远不会返回null;它至少会返回一个空集合。

答案 2 :(得分:2)

我认为你正在寻找这个:

int striko4goodProductCount = GoodProduct.AsEnumerable()
  .Where(r => r.Field<string>("MachineID") == "Striko 4")
  .Sum(r => (r.Field<int?>("VIngot") ?? 0) +
            (r.Field<int?>("Heads") ?? 0) + 
            (r.Field<int?>("Risers") ?? 0));
  • 按MachineID过滤然后按其分组将产生一个组 - 不是很有用。
  • + has precedence over ??,因此您的代码并不意味着它的意思。我添加了括号来解决这个问题。
  • striko4goodProductCount应为int类型,如果没有值,则为0 - 这是Sum的默认值:

      

    如果source不包含任何元素,则此方法返回零。