niico
niico

Reputation: 12749

Slapper.Automapper with Dapper.net using Guid Ids

I need to map a one to many flattened SQL query into nested objects using Dapper.net.

Slapper.Automapper seems a good way of doing this; as detailed in the answer to this question:

How do I write one to many query in Dapper.Net?

Erroneous dataset I get using Guids: enter image description here

public string MrFlibble3()
{
    using (var connection = new SqlConnection(Constr))
    {
        Slapper.AutoMapper.Cache.ClearInstanceCache();

        const string sql = @"SELECT tc.[IDG] as ContactIdg
                                ,tc.[ContactName] as ContactName
                                ,tp.[Idg] AS TestPhones_PhoneIdg
                                ,tp.[ContactIdg] AS TestPhones_ContactIdg
                                ,tp.[Number] AS TestPhones_Number
                                FROM TestContact tc
                                INNER JOIN TestPhone tp ON tc.Idg = tp.ContactIdg";

        // Step 1: Use Dapper to return the  flat result as a Dynamic.
        dynamic test = connection.Query<dynamic>(sql);

        // Step 2: Use Slapper.Automapper for mapping to the POCO Entities.
        // - IMPORTANT: Let Slapper.Automapper know how to do the mapping;
        //   let it know the primary key for each POCO.
        // - Must also use underscore notation ("_") to name parameters;
        //   see Slapper.Automapper docs.
        Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(TestContact), new List<string> { "ContactIDg" });
        Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(TestPhone), new List<string> { "PhoneIdg" });

        var testContact = (Slapper.AutoMapper.MapDynamic<TestContact>(test) as IEnumerable<TestContact>).ToList();

        string flibblethis = "";

        foreach (var c in testContact)
        {
            foreach (var p in c.TestPhones)
            {
                // Console.Write("ContactName: {0}: Phone: {1}\n", c.ContactName, p.Number);
                flibblethis += "Contact Name: " + c.ContactName + ". Number: " + p.Number + "<br />";
            }
        }

        return flibblethis;
    }
}

It works well in the example - except Slapper.Automapper doesn't appear to work if Ids are Guids rather than ints.

Is there any way to use Guid IDs with Slapper.Automapper - or is there an alternative way to map this using Dapper.net?

(Slapper.Automapper isn't widely used and I can't see anything online about this issue).

Upvotes: 4

Views: 3029

Answers (1)

Florian Haider
Florian Haider

Reputation: 1912

You have varying upper and lowercases in your property names, e.g. ContactIdg and ContactIDg. Slapper does case sensitive mappings, see this issue.

Upvotes: 5

Related Questions