【问题标题】:Get data using inner join from Dapper使用 Dapper 的内部联接获取数据
【发布时间】:2018-09-30 20:00:41
【问题描述】:

我正在处理一个项目的 DB 操作并开发 WinForms App C#,并且我正在使用 Dapper 从 DB 中获取数据,我遇到了需要使用内部联接检索数据的情况。例如。我有两张表 Authors 和 Book as Follow :

public class Authors
{
    public int AuthorId { get; set; }
    public string AuthorName { get; set; }
}
public class Book
{
    public int BookId { get; set; }
    public string AuthorId { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int Price { get; set; }
}

现在在 SQL Server 中,我可以使用以下查询轻松地从中获取数据:

select B.Title,b.Description,b.Price,A.AuthorName from author A inner join book B on A.AuthorId = B.Authorid

但我不知道如何使用 dapper 多重映射来做到这一点,我也看到了类似 This 的文章,但无法理解它是如何工作和拆分的。如果我能用我的班级设计获得相同的解决方案,我会很棒。 谢谢。

这是我想要的输出:ResultSet

【问题讨论】:

  • 您是否有一个基准测试表明 LINQtoSQL 和实体框架对于您的应用程序来说都太慢了?
  • 你想得到什么结果? SQL 中的值对或填充了所有导航属性和集合的实体(但我在您的模型中看不到它们)?
  • @AluanHaddad 请查看此链接exceptionnotfound.net/…
  • @arekzyla 我只想填满我的收藏,我用我想要的结果更新问题。谢谢
  • @Infii 但是您想要拥有AuthorsBook 类的集合还是一些带有标题、描述、价格和作者姓名的DTO 类?

标签: c# orm dapper micro-orm


【解决方案1】:

使用您链接的结果,您可以这样做:

public class Result
{
    public string Title { get; set; }
    public string Description { get; set; }
    public int Price { get; set; }
    public string AuthorName { get; set; }
}

connection.Query<Result>("SELECT B.Title,B.Description,B.Price,A.AuthorName FROM Author A INNER JOIN Book B on A.AuthorId = B.Authorid");

或者你可以使用动态类型。

如果您想与作者一起收藏书籍,那就另当别论了。然后你会这样做(为了示例选择 *):

var sql = "SELECT * FROM Author A INNER JOIN Book B on A.AuthorId = B.Authorid";
var result = connection.Query<Book, Author, Book>(sql,
(b, a) => { b.Author = a; return b; }, splitOn: "AuthorId");

splitOn参数应该是这样理解的:如果查询中所有的列都按照从左到右的顺序排列,那么左边的值属于第一类,右边的值属于到第二节课。

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2014-07-23
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多