我知道这样做是错误的,但我正在处理具有NULLS的遗留代码库,当它意味着空字符串时,反之亦然。
我无法立即看到它是如何可能的,但是当从数据库映射回来时,是否有可能获得(或修改小巧的所以它会返回空字符串而不是空字符串)。
答案 0 :(得分:6)
Dapper在看到 null 时不会调用任何setter,因此选项可能包括:
""
null
所以:
public class SomeDto
{
public SomeDto()
{
Name = "";
}
public string Name {get;set;}
}
或:
public class SomeDto
{
private string name;
public string Name { get {return name ?? "";} set {name = value;} }
}
但是,这仅适用于读取值;当传递dto in作为参数对象时,我无法想到一个漂亮的方法让dapper将""
转换为null
;选项包括:
""
替换为null
(也许写一个string NullIfBlank(this string s)
扩展方法)null
的类型上使用shim属性代替""
,并将数据库查询绑定到@NameOrNull
而不是@Name
答案 1 :(得分:1)
简而言之:取决于您如何将数据加载到精巧的工具,您可能会遇到两种不同的情况。
首先:打开您的数据提供者层,例如此帖子中的内容 - How to return null from a Dapper query rather than default(T)?。
第二种尝试方式:您可以在以下帖子中修改GetTypeDeserializer
- Change Dapper so that it maps a database null value to double.NaN
第三次和最后一次:我的友好建议是处理您以前的问题接受率。通过这种方式,您可以增加回答问题的机会。
希望这一切都有所帮助。
答案 2 :(得分:1)
您可以使用查询来控制此问题,例如:
public class Data
{
public string Foo { get; set; }
}
var result = conn.Query<Data>("select Foo = coalesce(Foo, '') from MyTable");
所以在上面的例子中,当Foo为null时,coalesce将返回一个空字符串。
答案 3 :(得分:0)
我倾向于在名为ConvertNull()的 string 上使用全局扩展方法,它将任何空值转换为空字符串。然后,您可以在任何地方调用它,而不会使代码看起来混乱。如果您直接在aspx页面上使用它,只需确保已导入扩展方法的命名空间,然后该方法将可供您使用:
namespace ExtensionMethods
{
using System;
public static class StringExtensionsClass
{
/// <summary>Converts null strings to empty strings</summary>
/// <param name="s">Input string</param>
/// <returns>Original string, or empty string if original string was null</returns>
public static string ConvertNull(this string s)
{
return s ?? "";
}
}
}
然后在字符串的实例上调用它。
用法:
myStringInstance.ConvertNull().Replace("\r\n", "<br />");