简体   繁体   English

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

[英]Error raised when trying to map multiple objects in dapper query

I was testing dapper with a table structure as given in SQL below 我正在使用下面的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 for generating data in the tables 用于在表中生成数据的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'

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 POCO对象是Layer和Theme,虽然我在SQL中没有提到它,但是Layer表和Theme表之间有一个关系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 任何人都可以指导我可能是什么问题

The issue is that your query returns Theme.Layer as a string but on your model its mapped as Layer class object. 问题是您的查询将Theme.Layer作为字符串返回,但在您的模型上将其映射为Layer类对象。 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. 解决此问题的一种方法是将查询更改为不返回该字段,因为它不需要,然后更新映射代码以将Layer属性设置为返回的图层对象。 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");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM