#c# #dapper
#c# #dapper
Вопрос:
Я взял вопрос и изменил его, чтобы сформировать свой вопрос. У меня есть запрос, который правильно отображается из начального класса во второй класс и элементы, присоединенные ко второму классу (3-му), но не элементы, присоединенные к 3-му классу. пример следующий.
public class Part {
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address {
public int Id { get; set; }
public string Street { get; set; }
public SiteOu Ou { get; set; }
}
public class SiteOu {
public int Id { get; set; }
public SiteOuName SiteOuN { get; set; }
}
public class SiteOuName
{
public int Id { get; set; }
public string Name { get; set; }
}
Dapper:
public void TestSplitOn()
{
var conn = new SqlConnection(@"Data Source=.SQLEXPRESS;Integrated Security=true;Initial Catalog=db");
conn.Open();
const string sql = "select Id = 1, Name = 'My Part', "
"Id = 2, Street = 'My Street', "
"Id = 1, SiteOuNameId = '1'"
"Id = 1, Name = 'My Site', " ;
var result = conn.Query<Part, Address, SiteOu, SiteOuName, Part>(sql, (part, address, siteOu, siteOuName) =>
{
part.Address = address;
address.Ou = siteOu;
SiteOu.SiteOuName = siteOuName
return part;
},
commandType: CommandType.Text
).FirstOrDefault();
}
Если я удаляю SiteOuName из сопоставления Dapper, код работает, но не отображает объект SiteOuName, но когда я оставляю его как есть, он показывает мне, что ссылка на объект address равна null.
Ответ №1:
Насколько я вижу, в вашем коде Dapper есть несколько проблем. Во-первых, ваш запрос должен быть похож;
const string sql = "select Id = 1, Name = 'My Part', "
"Id = 2, Street = 'My Street', "
"Id = 1, SiteOuNameId = '1',"
"Id = 1, Name = 'My Site'";
У вас отсутствует запятая рядом с SiteOuNameId = ‘1’, и у вас есть лишняя запятая и знак ‘ ‘ рядом с Name = ‘Мой сайт’
Во-вторых, ваше отображение неверно, оно должно быть похоже
part.Address = address;
address.Ou = siteOu;
siteOu.SiteOuN = siteOuName;
return part;
В вашем коде S — это верхний регистр, что заставляет разработчика думать, что вы используете класс SiteOu.
Кроме того, у класса SiteOu нет свойства с именем SiteOuName, оно должно быть SiteOuN .