Сопоставить SQL с классом в Dapper
Моя проблема: при использовании этого расширения оно только отображает значение идентификатора из базы данных в объект класса.
Так что мне интересно, как мне сделать так, чтобы он отображал другие значения?
C# Mapper
public class SoftwareReleaseTypeHandle : SqlMapper.TypeHandler<SoftwareRelease>
{
public override SoftwareRelease Parse(object value)
{
if (value == null || value is DBNull)
{
return null;
}
SoftwareRelease rel = new SoftwareRelease();
rel.ID = (Guid)value;
return rel;
}
public override void SetValue(IDbDataParameter parameter, SoftwareRelease value)
{
parameter.DbType = DbType.Guid;
parameter.Value = value.ID.ToString();
}
}
Таблица SQL выглядит следующим образом:
CREATE TABLE [dbo].[SoftwareRelease](
[ID] [uniqueidentifier] NOT NULL,
[Type] [tinyint] NOT NULL,
[ReleaseType] [tinyint] NOT NULL,
[Version] [nchar](30) NOT NULL,
[ZipFile] [varbinary](max) NOT NULL,
[Date] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Причина, по которой я использовал этот маппер, была в других местах в моем коде, и я мог сделать это автоматически:
class MyInstallation
{
public string Bla;
public string BlaBla;
SoftwareRelease MyInstallation;
}
И когда я тогда использую Dapper, чтобы получить из таблицы, которая похожа.
CREATE TABLE [dbo].[MyInstallation](
[ID] [uniqueidentifier] NOT NULL,
[Bl] [nchar](30) NOT NULL,
[BlaBla] [nchar](30) NOT NULL,
[MyInstallation] [uniqueidentifier] NOT NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
1 ответ
Обработчики типа Dapper предназначены для сопоставления значения одного столбца в вашей базе данных с одним членом в вашем POCO. Они используются для типов, которые ядро Dapper не понимает - как правило, все, что не является ядром.NET.
Вы не говорите точно, что вам нужно делать, но если вы просто пытаетесь читать SoftwareRelease
строк из базы данных, то вы можете просто сделать следующее:
myDb.Query<SoftwareRelease>("SELECT * FROM SoftwareRelease");
Обновить
Похоже, что вы действительно хотите, мульти-картографирование. Если у вас есть следующий запрос:
SELECT a.Bla, a.BlaBla, b.*
FROM MyInstallation a
INNER JOIN SoftwareRelease b ON a.SoftwareReleaseId = b.ID
Затем вы можете использовать следующее для заполнения объекта:
myDB.Query<MyInstallation, SoftwareRelease, MyInstallation>(
sql,
(installation, softwareRelease) => {
installation.SoftwareRelease = softwareRelease;
});