Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Dapper从多个表查询数据_C#_Sql Server_Api_.net Core_Dapper - Fatal编程技术网

C# 使用Dapper从多个表查询数据

C# 使用Dapper从多个表查询数据,c#,sql-server,api,.net-core,dapper,C#,Sql Server,Api,.net Core,Dapper,我有一个数据库表GTL_TITLES,它有两个外键AuthorId和PublisherId。如果要从数据库中查询标题,还需要从AUTHOR和PUBLISHER表中获取信息。为此,我创建了一个存储过程,用于连接所有三个表并选择以下列: 我的GtlTitle模型类如下所示: public string ISBN { get; set; } public string VolumeName { get; set; } public string TitleDescription { get; set;

我有一个数据库表GTL_TITLES,它有两个外键AuthorId和PublisherId。如果要从数据库中查询标题,还需要从AUTHOR和PUBLISHER表中获取信息。为此,我创建了一个存储过程,用于连接所有三个表并选择以下列:

我的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; }
正如您可能猜到的,类Author有两个字符串:FirstName和LastName,Publisher有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:volumeName-97581,titleDescription:Description-97581,publisherName:Publisher-714,发布日期:2020-05-23T00:00:00,titleAuthor:null,Publisher:null}

如您所见,titleAuthor和publisher为null。我怎样才能解决这个问题?我是否需要在GtlTitle模型类中编写公共字符串FirstName之类的字段,或者是否有填充作者和发布者的方法
此外?

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();


这回答了你的问题吗@Crowcoder这不是嵌套的情况,更像一对一映射。看起来像一个复杂的对象查询。你只需要告诉Dapper每个物体在哪里。查看此链接:@Alex splitOn在我发布的链接中被提到过几次。@Crowcoder是的,提到过,但当前问题的作者没有嵌套关系,只是一个简单的一对一映射。