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

问题描述 投票:0回答:4

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

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

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

但是,这仅适用于 reading 值;当将 dto 作为参数对象传递时,我想不出一种nice的方法可以让 dapper 将

""
转换为
null
;选项包括:

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

2
投票

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

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

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

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


1
投票

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

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

第二种尝试方法:您可以修改您的

GetTypeDeserializer
,如下面的帖子 - 更改 Dapper,以便将数据库空值映射到 double.NaN


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.