Joe

Mister Doctor Professor
posts - 23, comments - 19, trackbacks - 134

ExecuteList<T> and ExecuteItem<T>

In a hand coded data-access layer you often end up with some variant of this pattern when translating a datareader to an entity.

public List<ICarrier> LoadList()
{    
    List<ICarrier> items = new List<ICarrier>();
    using (SafeDataReader reader = new AdoHelper().ExecuteDataReader(CommandType.Text, "Select * from _lu_Carrier"))
    {
        while (reader.Read())
        {
            items.Add(MapCarrier(reader));
        }
    }
    return items;
}


where your ADOHelper does whatever it needs to do to connect to the database and run your query.  This is generally coupled with "mapping" method (MapCarrier in this instance)

public static ICarrier MapCarrier(SafeDataReader dr)
{
    ICarrier carrier = new Carrier();
    carrier.Name = dr.GetString("Name");
    carrier.Phone = dr.GetString("Phone");
    carrier.SCAC = dr.GetString("SCAC");
    carrier.URL = dr.GetString("URL");

    return carrier;
}

I think this is a fairly standard approach, and it works well.  However, it's tedious and can lead to lots of repetition as your DAL grows.  Enter the magic of generics and delegates which allow the code in the first block to become something like this:

public List<ICarrier> GetList()
{
    return new AdoHelper().ExecuteList<ICarrier>(CommandType.Text, 
                                                 "Select * from _lu_Carrier", 
                                                 MapCarrier);
}

 

ExecuteList<T> is overloaded to allow for a few variations which all route to this:

public List<T> ExecuteList<T>(CommandType commandType, string commandText, Func<T, SafeDataReader> mappingCallback, params SqlParameter[] parameters)
{
    List<T> collection = new List<T>();
    using (SafeDataReader reader = ExecuteDataReader(commandType, commandText, parameters))
    {
        while (reader.Read())
        {
            collection.Add(mappingCallback(reader));
        }
    }
    return collection;
}

The "magic" here is the Func<T SafeDataReader> delegate being passed in.  This is (lifted directly from Rhino.Commons) and is declared as

public delegate TResult Func<TResult, S>(S s1);

ExecuteItem<T> is similar, but returns a single entity instead of a collection

public T ExecuteItem<T>(CommandType commandType, string commandText, Func<T, SafeDataReader> mappingCallback, params SqlParameter[] parameters)
{
    using (SafeDataReader reader = ExecuteDataReader(commandType, commandText, parameters))
    {
        while (reader.Read())
        {
            return mappingCallback(reader);
        }
    }
    return default(T);
}

 

Over even a small project this can save a lot of typing and a substantial amount of time.

Print | posted on Thursday, January 17, 2008 3:08 PM |

Feedback

Gravatar

# Animal abuse.

Animal sex pictures. Farm animal and girl sex. Free animal sex. Animal sex video. Animal sex with girl. Animal sex stories. Animal cell diagram. Animal sex.
6/19/2008 9:30 AM | Animal sex.
Gravatar

# Animal sex.

Animal sex.
7/3/2008 6:10 PM | Animal sex.
Gravatar

# Asian transexuals.

Asian xxx.
8/12/2008 5:59 PM | Asian lesbians.
Gravatar

# Angelina jolie nude.

Angelina jolie.
Gravatar

# Shitting.

Girl shitting. Girls scat shitting. Women shitting their pants. Shitting shitting shittin. Shitting girls.
11/20/2008 7:26 AM | Scat shitting movies.
Gravatar

# Student loans.

Student loans.
11/30/2008 1:42 PM | Student loans.
Gravatar

# Lesbians sex.

Lesbians sex.
12/1/2008 1:20 PM | Pissing lesbians.
Gravatar

# Young nude teens.

Chatrooms for teens. Sexy teens. Tiny teens. Bunny teens. Teens naked. Secret friends live sex chat young teens. Nudist teens. Hot teens. Nude teens.
12/9/2008 9:57 PM | Lesbian teens.
Gravatar

# Free mobile ringtones.

Ringtones composer.
12/10/2008 8:12 AM | Free ringtones.
Gravatar

# Teen pussy.

Teen pussy. Tight teen pussy.
12/10/2008 12:41 PM | Nude teen pussy nice.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 6 and 5 and type the answer here:

Powered by: