我正在试图解决为什么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 });
这现在按预期工作,但我宁愿该方法可以正常调用并仍然返回预期的结果。
答案 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))