PetaPoco ExecuteScalar具有可空的Guid

时间:2013-12-11 07:38:54

标签: c# asp.net-mvc petapoco

我正在试图解决为什么petapoco的“Exists()”返回错误,它应该返回true。我用这样的东西来测试:

一个简单的petapoco模型:

[TableName("WorkLog")]
[PrimaryKey("Id")]
public class WorkLog : DefaultConnectionDB.Record<WorkLog>
{
     public int Id { get; set; }
     public Guid? Customer { get; set; }
     public Guid? Project { get; set; }
}

具有与上述相同结构的数据库表,填充了Id和Customers(仅为Project的空值)。

创建测试对象:

var x = new WorkLog {Id = 0, Customer = 'xxx-xxx-xxx...', Project = null}

根据“项目”查询数据库中是否存在工作日志:

var exist = db.Exists<WorkLog>("Project=@p", new { p = x.Project });

此方案中的结果为“false”。如果我使用Guid for Project填充模型,数据库和查询,它会返回“true”,就像它应该的那样。

所以我猜这与null和DbNull比较有关,但我似乎找不到合适的挖掘地点。我尝试过一个帮助方法,在查询之前将“null”转换为“DbNull”,但它仍然返回false。

临时解决方案:

目前我通过做...已经解决了这个问题。

var exist = db.Exists<WorkLog>(x.Project == null ? "Project IS NULL" : "Project=@p", new { p = x.Project });

这现在按预期工作,但我宁愿该方法可以正常调用并仍然返回预期的结果。

1 个答案:

答案 0 :(得分:3)

问题在ADO.net方面比在PetaPoco中更多。 PetaPoco只创建Params并用你的值填充它们。

但是,在WHERE子句中处理null非常棘手,因为this MSDN article说:

  

测试Null

     

如果表(在数据库中)中的列允许空值,则无法测试参数值“等于”null。相反,你需要   编写一个WHERE子句来测试列是否为null和   参数为null。以下SQL语句返回的行所在的位置   LastName列等于分配给@LastName参数的值,   或者LastName列和@LastName参数是否都是   空。

SELECT * FROM Customers
WHERE ((LastName = @LastName) OR (LastName IS NULL AND @LastName IS NULL))