Je testais dapper avec une structure de table donnée en SQL ci-dessous
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 pour générer des données dans les 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'
les objets POCO étaient Layer et Theme, même si je ne l'ai pas mentionné dans le SQL, il y a une relation entre la table Layer et la table 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()
{
}
}
J'obtiens l'erreur suivante lorsque j'essaie de mapper le calque et le thème en une seule requête comme:
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"
);
L'exception soulevée est
Error parsing column 9 (Layer=MOJO - String)
Quelqu'un peut-il me guider sur ce que le problème peut être
Le problème est que votre requête renvoie Theme.Layer en tant que chaîne, mais que votre modèle est mappé en tant qu'objet de classe Layer. Une façon de résoudre ce problème serait de modifier la requête pour ne pas renvoyer ce champ car il n'est pas nécessaire de toute façon, puis mettre à jour votre code de mappage pour définir la propriété Layer sur l'objet de couche renvoyé. Quelque chose comme:
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");