7

我知道这是一种错误的做法,但我正在处理具有 NULLS 的遗留代码库,当它表示空字符串时,反之亦然。

我无法立即看到它是如何可能的,但是当从数据库映射回来时,是否有可能获取(或修改 dapper 以便它会)返回一个空字符串而不是空字符串。

4

4 回答 4

9

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 作为参数对象传递时,我想不出一种让 dapper 变成的好方法;选项包括:""null

  • 创建一个匿名类型,替换""null(也许写一个string NullIfBlank(this string s)扩展方法)
  • null在返回的类型上有一个 shim 属性"",并让您的数据库查询绑定到@NameOrNull而不是@Name
于 2012-12-19T07:41:45.900 回答
2

您可以通过查询来控制它,例如:

    public class Data
    {
        public string Foo { get; set; }
    }

    var result = conn.Query<Data>("select Foo = coalesce(Foo, '') from MyTable");

所以在上面的例子中,当 Foo 为 null 时,coalesce 将返回一个空字符串。

于 2012-12-19T05:48:56.810 回答
1

简而言之:根据您将数据加载到 dapper 的方式,您可能会遇到两种不同的情况。

首先:打开您的数据提供者层,例如在这篇文章中 -如何从 Dapper 查询中返回 null 而不是 default(T)?.

第二种尝试方法:您可以GetTypeDeserializer在以下帖子中修改您的喜欢 -更改 Dapper 以便将数据库空值映射到 double.NaN

第三个也是最后一个:我的友好建议是提高您以前的问题接受率。通过这种方式,您可以增加回答您的问题的机会。

希望这一切都会有所帮助。

于 2012-12-19T02:28:25.600 回答
0

我倾向于在名为 ConvertNull() 的字符串上使用全局扩展方法,它将任何空值转换为空字符串。然后,您可以在任何地方调用它,而不会让您的代码看起来杂乱无章。如果您直接在 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 />");

于 2014-07-09T08:43:34.797 回答