我正在尝试使用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方法。
如果我错过了一些显而易见的事情并感谢您的时间,请提前道歉。
答案 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子句。