我在下面重复查询,'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/