这个问题有一个更简单的解决方案。
如果属性 MyCar 不在数据库中,而且很可能不在,那么简单地删除 {get;set;} 并且“属性”成为一个字段并被 DapperExtensions 自动忽略。如果您实际上将此信息存储在数据库中,并且它是一个未序列化为 JSON 或类似格式的多值属性,我认为您可能要求的是您不想要的复杂性。没有对象“汽车”的 sql 等效项,并且模型中的属性必须映射到 sql 识别的东西。
更新:
如果“Car”是数据库中表的一部分,那么您可以使用 Dapper 的 QueryMultiple 将其读入 CarMaker 对象。
我以这种方式使用它:
dynamic reader = dbConnection.QueryMultiple("Request_s", param: new { id = id }, commandType: CommandType.StoredProcedure);
if (reader != null)
{
result = reader.Read<Models.Request>()[0] as Models.Request;
result.reviews = reader.Read<Models.Review>() as IEnumerable<Models.Review>;
}
请求类有一个这样的字段:
public IEnumerable<Models.Review> reviews;
存储过程如下所示:
ALTER PROCEDURE [dbo].[Request_s]
(
@id int = null
)
AS
BEGIN
SELECT *
FROM [biospecimen].requests as bn
where bn.id=coalesce(@id, bn.id)
order by bn.id desc;
if @id is not null
begin
SELECT
*
FROM [biospecimen].reviews as bn
where bn.request_id = @id;
end
END
在第一次读取中,Dapper 忽略了字段评论,在第二次读取中,Dapper 将信息加载到字段中。如果返回 null 集,Dapper 将加载带有 null 集的字段,就像它加载带有 null 内容的父类一样。
然后第二个 select 语句读取完成对象所需的集合,Dapper 存储输出,如图所示。
在目标父类有多个同时显示的子类的情况下,我一直在我的存储库类中实现这一点。
这可以防止多次访问数据库。
当目标类是子类并且您需要有关与其相关的父类的信息时,您也可以使用此方法。