Reputation: 12749
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:
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
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