Error raised when trying to map multiple objects in dapper query

c# dapper

Question

I was testing dapper with a table structure as given in SQL below

    CREATE TABLE [dbo].[Layer](
        [Name] [nvarchar](50) NOT NULL,
        [Key] [nvarchar](255) NULL,
        [FeatureColumn] [nvarchar](255) NULL,
        [Description] [nvarchar](255) NULL,
        [Defaults] [nvarchar](255) NULL,
        [Comments] [nvarchar](255) NULL,
        PRIMARY KEY  ([Name] ASC)
    )

    CREATE TABLE [dbo].[Theme](
        [Name] [nvarchar](50) NOT NULL,
        [IsDefault] [bit] NULL,
        [Field] [nvarchar](255) NULL,
        [Layer] [nvarchar](255) NULL,
        PRIMARY KEY  ([Name] ASC)
    )

SQL for generating data in the tables

    INSERT INTO LAYER 
           (Name  ,[Key]   ,[Description]    ,Defaults,Comments)
    SELECT  'MOJO'  ,'ADM1','Administrative' ,'NULL'    ,'NULL'     UNION ALL
    SELECT  'Roads' ,'LID' ,'Roads'          ,'NULL'    ,'NULL'


    INSERT INTO Theme (Name,IsDefault,Field,Layer)
    SELECT 'M01',1,'ADM1','MOJO'

the POCO objects were Layer and Theme, although I have not mentioned it in the SQL, there is a relation between Layer table and Theme table Theme.Layer -> Layer

    public class Layer 
    {
        public virtual string Name { get; set; }
        public virtual string Key { get; set; }
        public virtual string Description{ get; set; }
        public virtual ICollection<Theme> Themes { get; set; }
        public virtual string Defaults { get; set; }
        public virtual string Comments { get; set; }

        public Layer()
        {
            Themes = new List<Theme>();
        }

    }

    public class Theme 
    {

        public virtual string Name { get; set; }
        public virtual bool IsDefault { get; set; }
        public virtual string Field { get; set; }
        public virtual Layer Layer { get; set; }

        public Theme()
        {
        }

    }

I get the following error when I try to map Layer and Theme in a single query like :

    var sql = @"SELECT * FROM  Layer AS a LEFT OUTER JOIN
    Theme AS b ON a.Name = b.Layer";

    var k = conn.Query<Layer,Theme,  Theme>(
        sql,
        (a, b) => { a.Themes.Add(b); return a ; },
        splitOn: "Name"
        );

The exception raised is

   Error parsing column 9 (Layer=MOJO - String)

Can anyone guide me as to what the issue may be

Accepted Answer

The issue is that your query returns Theme.Layer as a string but on your model its mapped as Layer class object. One way to fix this would be to change the query to not return that field since its not needed anyways and then update your mapping code to set the Layer property to the layer object returned. Something like:

var sql = @"SELECT a.*, b.Name, b.IsDefault, b.Field
            FROM  Layer AS a 
            LEFT OUTER JOIN Theme AS b ON a.Name = b.Layer";

var k = conn.Query<Layer, Theme, Layer>(sql, (a, b) =>
        {
            if (b != null)
                b.Layer = a;
            a.Themes.Add(b);
            return a;
        }, splitOn: "Name");



Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why