Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting Dapper to return an empty string instead of a null string

Tags:

dapper

I know it's kind of the wrong thing to do, but I'm dealing with a legacy codebase that has NULLS when it means empty strings and vice versa.

I can't immediately see how it is possible, but is it possible to get (or modifiy dapper so it will) return an empty string instead of a null string when mapping back from the database.

like image 298
Lachmania Avatar asked Dec 19 '12 02:12

Lachmania


People also ask

Does an empty string return null?

An empty string is a String object with an assigned value, but its length is equal to zero. A null string has no value at all. A blank String contains only whitespaces, are is neither empty nor null , since it does have an assigned value, and isn't of 0 length.

How do you replace a null in a string?

There are two ways to replace NULL with blank values in SQL Server, function ISNULL(), and COALESCE(). Both functions replace the value you provide when the argument is NULL like ISNULL(column, '') will return empty String if the column value is NULL.

Is empty string same as null?

The Java programming language distinguishes between null and empty strings. An empty string is a string instance of zero length, whereas a null string has no value at all. An empty string is represented as "" . It is a character sequence of zero characters.

Does dapper return null?

In this method, the query has the option to return nothing without risking a thrown exception in Dapper. This method API returns exactly one object or the default value which is typically null.


2 Answers

Dapper doesn't call any setter when it sees a null, so options might include:

  • set the default value to "" in the constructor
  • check for null in the accessor

So:

public class SomeDto
{
    public SomeDto()
    {
        Name = "";
    }
    public string Name {get;set;}
}

or:

public class SomeDto
{
    private string name;
    public string Name { get {return name ?? "";} set {name = value;} }
}

However, this only applies to reading values; I can't think of a nice way to get dapper to turn "" into null when passing the dto in as the parameter object; options include:

  • creating an anon-type, substituting "" to null (perhaps write a string NullIfBlank(this string s) extension method)
  • having a shim property on the type that returns null in place of "", and have your database query bind to @NameOrNull rather than @Name
like image 119
Marc Gravell Avatar answered Nov 25 '22 22:11

Marc Gravell


You can control this with your queries, for example:

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

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

So in the above example, coalesce will return an empty string when Foo is null.

like image 21
Void Ray Avatar answered Nov 25 '22 23:11

Void Ray