我有数据库表 GTL_TITLES 其中有两个外键。AuthorId
和 PublisherId
. 如果我想从数据库中查询一个标题,我想同时从 撰稿人 和 出版商 表。为此,我创建了一个存储过程,将所有三个表连接起来,并选择以下列。
"我的 GtlTitle 模型类是这样的。
public string ISBN { get; set; }
public string VolumeName { get; set; }
public string TitleDescription { get; set; }
public string PublisherName { get; set; }
public DateTime PublicationDate { get; set; }
public Author TitleAuthor { get; set; }
public Publisher Publisher { get; }
正如你所猜测的,类 撰稿人 有两个字符串。FirstName
和 LastName
和 出版社 有 PublisherName
.
这些都是说的,这是调用数据库的方法。
public GtlTitle GetTitle(string ISBN)
{
using (var connection = new SqlConnection(_connection))
{
connection.Open();
return connection.QuerySingle<GtlTitle>("GetTitleByISBN", new { ISBN }, commandType: CommandType.StoredProcedure);
}
}
并返回以下内容 {"isbn":"978-0-10074-5","volumeName":"Volume Name - 97581","titleDescription":"Description - 97581","publisherName":"Publisher - 714","publicationDate":"2020-05-23T00:00:00","titleAuthor":null,"publisher":null}
如你所见, titleAuthor
和 publisher
都是空的。如何解决这个问题?我是否需要写像 public string FirstName
在 GtlTitle 模型类来代替,或者有什么方法可以填充到 撰稿人 和 出版社 以及?
Dapper支持多映像与 splitOn
参数,通过提供新对象开始的列名,你可以将一行分割成多个对象。
return connection.Query<GtlTitle, Author, Publisher, GtlTitle>(sql,
(g,a,p) => {
g.TitleAuthor = a;
g.Publisher = p;
return g; },
splitOn: "FirstName,PublisherName").First();