C# 尝试在dapper查询中映射多个对象时出错

C# 尝试在dapper查询中映射多个对象时出错,c#,dapper,C#,Dapper,我在用下面SQL中给出的表结构测试dapper CREATE TABLE [dbo].[Layer]( [Name] [nvarchar](50) NOT NULL, [Key] [nvarchar](255) NULL, [FeatureColumn] [nvarchar](255) NULL, [Description] [nvarchar](255) NULL, [Defaults] [nvarchar

我在用下面SQL中给出的表结构测试dapper

    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

    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'
POCO对象是Layer和Theme,虽然我在SQL中没有提到它,但Layer table和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()
        {
        }

    }

有谁能告诉我这个问题可能是什么

问题是,您的查询以字符串形式返回Theme.Layer,但在您的模型上,它映射为Layer类对象。解决此问题的一种方法是将查询更改为不返回该字段,因为它无论如何都不需要,然后更新映射代码以将图层特性设置为返回的图层对象。比如:

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");
var sql=@“选择一个*,b.名称,b.IsDefault,b.字段
从层作为一个
左外连接主题为a上的b。名称=b.Layer”;
var k=conn.Query(sql,(a,b)=>
{
如果(b!=null)
b、 层=a;
a、 主题。添加(b);
返回a;
},splitOn:“姓名”);
   Error parsing column 9 (Layer=MOJO - String)
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");