Dapper.SimpleCRUD - ISNULL

时间:2015-11-23 01:36:18

标签: c# nullable dapper isnull

我正在尝试使用Dapper.SimpleCRUD检索层次结构中的根节点。通过没有父节点来标识根节点。这是我正在做的电话:

var whereConditions = new object { ParentId = (int?)null, CompanyId = 1 };
var root = db.GetList<T>(whereConditions).FirstOrDefault();

这是生成的SQL:

exec sp_executesql N'Select * from [Folders] where [CompanyId] = @CompanyId and [ParentId] = @ParentId',N'@CompanyId int,@ParentId int',@CompanyId=13,@ParentId=NULL

问题是[ParentId] = @ParentId将不返回任何记录,因为@ParentId为空。要匹配记录,语句必须为[ParentId] IS NULL

我想知道SimpleCRUD是否可以检测到可空参数何时等于NULL并且可以生成IS NULL语句?像这样:

exec sp_executesql N'Select * from [Folders] where [CompanyId] = @CompanyId and [ParentId] IS NULL',N'@CompanyId int,@ParentId int',@CompanyId=13,@ParentId=NULL

我知道我可以手动发送WHERE字符串但希望采用自动SimpleCRUD方法。

如果我错过了一些显而易见的事情并感谢您的时间,请提前道歉。

2 个答案:

答案 0 :(得分:0)

GitHub上的Elmar-de-groot亲切地指出了问题here

  

嗨约翰,我今天也遇到了这个问题。问题   似乎源自“BuildWhere”&#39;那里有一个硬编码的&#34; =&#34;等号。

private static void BuildWhere(StringBuilder sb,
IEnumerable<PropertyInfo> idProps, object sourceEntity) {  .... }

我创建了这个解决方法来解决我的问题:

private static void BuildWhere(StringBuilder sb, IEnumerable<PropertyInfo> idProps, object sourceEntity, object whereConditions = null)
var propertyInfos = idProps.ToArray();
string param = "";

...

try
{
    // use the 'is null' operator if value of parameter null, else use '=' operator
    param = (whereConditions.GetType().GetProperty(propertyToUse.Name).GetValue(whereConditions, null) != null ? "{0} = @{1}" : "{0} is null");
}
catch (Exception err)
{
    param = "{0} = @{1}";
}                

sb.AppendFormat(param, GetColumnName(propertyToUse), propertyInfos.ElementAt(i).Name);

答案 1 :(得分:0)

我仔细观察了这一点,并且真的不喜欢实现必须在try / catch中工作的东西。

你可以使用手册where where case吗?

var user = connection.GetList("where age = 10 or Name like '%Smith%'");

或在你的情况下:

var user = connection.GetList("where ParentId is null AND CompanyId = 1");

您可以根据ParentId是否为空来轻松生成不同的where子句。