如何检测C#LINQ查询中未返回任何数据

本文关键字:返回 任何 数据 查询 C#LINQ 何检测 检测 | 更新日期: 2023-09-27 18:22:18

我正在进行下面的重复查询,其中"a"answers"b"递增("b"增量到极限,然后重置,"a"增量)。可能存在多个给定值为"a"answers"b"的行。


    struct MyData {int mdA; int mydB; }
    ....
    int find_next_a(int a, int b)
    {
      var q = from p in db.pos
        where (p.a >= a && p.b > b) || (p.a > a && p.b > 0)
        orderby p.a, p.b
        select new MyData
        { 
          mdA = p.a, 
          mdB = p.b 
        };
      return q.First().mdA;   // ERROR: InvalidOperationException at end of data
    }

查询一直工作到我到达表的末尾。然后我得到了异常InvalidOperationException。我不能调用q.Count(),因为我得到了同样的异常。

如何检测q中没有有效数据?

[编辑:]感谢Jon Skeet(以及Bojan Skrchevski,Bodrick),我将解决方案发布到上面。


    int find_next_a(int a, int b)
    {
      var q = from p in db.pos
        where (p.a >= a && p.b > b) || (p.a > a && p.b > 0)
        orderby p.a, p.b
        select new { p.a, p.b };
      var result = q.FirstOrDefault();  // catch running past end of table
      if (result == null)
        return -1; 
      return q.First().a;  // return real data
    }

如何检测C#LINQ查询中未返回任何数据

您可以使用FirstOrDefault代替:

var result = q.FirstOrDefault();
if (result == null)
{
    // Query results were empty
}

请注意,没有办法区分"实际结果是元素类型的默认值"answers"没有结果"。。。这不是问题,因为所有实际结果都是非空引用,但值得注意。

编辑:我没有注意到你在使用一个自定义结构;我把它误读为匿名类型。我强烈建议在这里使用匿名类型,而不是可变结构。或者,考虑到您只需要mdA,您可以使用:

var q = from p in db.pos
        where (p.a >= a && p.b > b) || (p.a > a && p.b > 0)
        orderby p.a, p.b
        select (int?) p.a;
int? result = q.FirstOrDefault();
if (result == null)
{
    // No results - take whatever action
}
else
{
    // Got a result - find the underlying value...
    int a = result.Value;
}

使用FirstOrDefault()而不是First(),然后在使用前检查null值。

var rResult = q.FirstOrDefault();
if(rResult != null)
{
   var something = rResult.mda;
}

您可以使用FirstOrDefault()来避免InvalidOperationException。在以下示例中,如果q没有元素,则x将为null。然后,您可以对此进行检查并相应地继续操作。

var x = q.FirstOrDefault ();
return x == null ? -1 : x.mdA;