【发布时间】:2012-05-31 23:47:59
【问题描述】:
我正在使用带有 C# 4.0 的 PetaPoco Micro-ORM。
以下代码从数据库中检索单行:
var result = db.SingleOrDefault<TdUsers>(getUserQuery);
我想检查结果是否包含任何行,以及是否为空。最好的方法是什么?
【问题讨论】:
标签: c# .net c#-4.0 .net-4.0 petapoco
我正在使用带有 C# 4.0 的 PetaPoco Micro-ORM。
以下代码从数据库中检索单行:
var result = db.SingleOrDefault<TdUsers>(getUserQuery);
我想检查结果是否包含任何行,以及是否为空。最好的方法是什么?
【问题讨论】:
标签: c# .net c#-4.0 .net-4.0 petapoco
if (result == null || result.Count() == 0) {
// Checks whether the entire result is null OR
// contains no resulting records.
}
我认为问题不在于您对 null 的检查,因为 linq 是延迟加载。您的错误在于使用表达式 db.SingleOrDefault<TdUsers>(getUserQuery);。
.Single<T>(expression) 不返回 null - 如果结果没有返回值,则会出错。
但是,.SingleOrDefault<T>(expression) 如果表达式没有结果,则返回空值 - 因此最好与 if (result == null) 类型检查结合使用,就像您在此处使用的那样。
【讨论】:
!result.Any() :)
var result = db.SingleOrDefault<TdUsers>(getUserQuery);
在上面的代码中 SingleOrDefault 将返回空值或指定的 泛型类型(在运行时已知)。
为了检查返回值是否为空,你可以简单地使用
if(result!=null)
{
//do your code stuff
}
else
{
//stuff do be done in case where result==null
}
【讨论】:
你可以这样做:
result.ToList() // Convert result to a list
if (result.Any()) {
// result is not null
}
【讨论】:
result 可能为空,此时在调用.ToList() 或.Any() 时会抛出NullReferenceException。跨度>
var v = result.ToList();
现在检查
if (v is not null)
{
}
else if (v.Count()>0)
{
}
【讨论】: