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

ahn*_*kle 4 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
    }
Run Code Online (Sandbox Code Playgroud)

查询有效,直到我到达表的末尾.然后我得到异常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
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

你可以FirstOrDefault改用:

var result = q.FirstOrDefault();
if (result == null)
{
    // Query results were empty
}
Run Code Online (Sandbox Code Playgroud)

请注意,在"实际结果是元素类型的默认值"和"无结果"之间无法区分......这里不是问题,因为所有实际结果都是非空引用,但它值得意识到.

编辑:我没有注意到你使用的是自定义结构; 我把它误解为匿名类型.我强烈建议在这里使用匿名类型而不是可变结构.或者,鉴于您只需要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;
}
Run Code Online (Sandbox Code Playgroud)