在 Dapper 中将 SQL 映射到 class
Map SQL to class in Dapper
我的问题:使用此扩展程序时,它仅将 ID 值从数据库映射到 class 对象。
所以我很好奇如何让它映射其他值?
C# 映射器
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 table 看起来像这样:
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 从看起来像的 table 中获取时。
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]
Dapper 类型处理程序旨在将数据库中的单个列值映射到 POCO 中的单个成员。它们用于 Dapper 核心不理解的类型——通常是任何不是 .NET 核心类型的类型。
你没有说出你需要做什么,但如果你只是想从数据库中读取 SoftwareRelease
行,那么你可以简单地执行以下操作:
myDb.Query<SoftwareRelease>("SELECT * FROM SoftwareRelease");
更新
听起来您真正想要的是 multi-mapping。如果您有以下查询:
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;
});
我的问题:使用此扩展程序时,它仅将 ID 值从数据库映射到 class 对象。
所以我很好奇如何让它映射其他值?
C# 映射器
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 table 看起来像这样:
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 从看起来像的 table 中获取时。
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]
Dapper 类型处理程序旨在将数据库中的单个列值映射到 POCO 中的单个成员。它们用于 Dapper 核心不理解的类型——通常是任何不是 .NET 核心类型的类型。
你没有说出你需要做什么,但如果你只是想从数据库中读取 SoftwareRelease
行,那么你可以简单地执行以下操作:
myDb.Query<SoftwareRelease>("SELECT * FROM SoftwareRelease");
更新
听起来您真正想要的是 multi-mapping。如果您有以下查询:
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;
});