Ошибка при попытке отобразить несколько объектов в запросе dapper
Я тестировал dapper со структурой таблицы, как указано в 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)
Может ли кто-нибудь направить меня относительно того, что может быть проблема
1 ответ
Проблема в том, что ваш запрос возвращает Theme.Layer в виде строки, но в вашей модели он отображается как объект класса 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");