c# - 如何检测 C# LINQ 查询中没有返回数据

标签 c# linq

我在下面重复查询,'a' 和 'b' 递增('b' 递增到一个限制,然后重置和 'a' 递增)。可能有多行具有给定值“a”和“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
    }

最佳答案

您可以改用 FirstOrDefault:

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

请注意,无法区分“作为元素类型默认值的真实结果”和“无结果”……这不是问题,因为所有真实结果都是非空引用,但值得注意。

编辑:我没有注意到您使用的是自定义结构;我将其误读为匿名类型。我强烈建议在这里使用匿名类型而不是可变结构。或者,假设您无论如何只需要 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;
}

关于c# - 如何检测 C# LINQ 查询中没有返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9110137/

相关文章:

c# - 在c#中对多个元素的结构数组进行排序

c# - 如何测试 Web Api 服务?

c# - 如何在 C# 中关闭该文件进程后删除文件

c# - 如何使用 Language-Ext 将 Task 转换为 Task<Unit>

c# - 简单的Linqpad Linq join语句,选择所有字段

c# - LINQ 按对象类型选择

c# - LINQ - 转换为字符串 LIST 并替换字符

c# - 使用 Func<> 类型来分配/更改变量

c# - C#创建派生类时,是否可以用n参数函数覆盖0参数虚函数?

c# - 多个开发人员同时 checkin 迁移时的 EF 迁移