让 Dapper 返回空字符串而不是空字符串

  • 本文关键字:字符串 Dapper 返回 dapper
  • 更新时间 :
  • 英文 :


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

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

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;} }
}

但是,这仅适用于读取值;我想不出一种方法可以让 dapper 在将 dto 作为参数对象传入时将""变成null;选项包括:

  • 创建一个匿名类型,将""替换为null(也许编写一个string NullIfBlank(this string s)扩展方法)
  • 在返回 null 代替 "" 的类型上具有 shim 属性,并将数据库查询绑定到@NameOrNull而不是@Name

您可以使用查询来控制这一点,例如:

    public class Data
    {
        public string Foo { get; set; }
    }
    var result = conn.Query<Data>("select Foo = coalesce(Foo, '') from MyTable");

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

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

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

第二种尝试方法:您可以修改您的GetTypeDeserializer,如下面的帖子 - 更改 Dapper 以便它将数据库 null 值映射到双精度值。南

第三点也是最后一点:我友好的建议是按照您之前的问题接受率开展工作。通过这种方式,您可以增加回答问题的机会。

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

我倾向于在字符串上使用名为 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 ?? "";
        }
    }
}

然后在字符串的实例上调用 this。

用法:

myStringInstance.ConvertNull().Replace("rn", "<br />");

最新更新