3

以下のSQLに示すように、テーブル構造でダッパーをテストしていました

    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 テーブルと 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()
        {
        }

    }

次のような単一のクエリでレイヤーとテーマをマップしようとすると、次のエラーが発生します。

    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"
        );

発生する例外は

   Error parsing column 9 (Layer=MOJO - String)

問題が何であるかについて誰でも私を導くことができますか

4

1 に答える 1

0

問題は、クエリがTheme.Layerを文字列として返すが、モデルではLayerクラスオブジェクトとしてマップされることです。これを修正する1つの方法は、クエリを変更してそのフィールドが必要ないためにそのフィールドを返さないようにし、マッピングコードを更新して、返されるレイヤーオブジェクトに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");
于 2012-09-16T16:35:56.420 に答える