选择“使用Dapper点网张贴标签”

本文关键字:贴标签 使用 Dapper 选择 | 更新日期: 2023-09-27 18:26:27

我的数据库中有三个表。Post、Tag和PostTag。标记表和Post表具有多对多关系,因此创建了PostTag表。

我的问题是,我如何选择表中所有带有标签的帖子,并使用Dapper.net将结果映射到我的POCO实体。

这是我的poco课程。职位:

public class Post
{
    public long Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

标签:

public class Tag
{
    public long Id { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Post> Posts { get; set; }
}

我想选择所有帖子,并为每个帖子添加所有相关标签。我想知道如何获得这样的ef查询结果:_context.Posts.Include(x=>x.Tags).ToList()

选择“使用Dapper点网张贴标签”

Dapper只是一个对象映射库,您必须自己编写原始SQL或存储过程。例如:

var sql = 
@"
select Id, Title, Body from Post where Id = @id
select Id, Title from Tag t join PostTag pt on pt.TagId = p.Id where pt.PostId = @id";
using (var multi = connection.QueryMultiple(sql, new {id=postId}))
{
   var post = multi.Read<Post>().Single();
   var tags= multi.Read<Tag>().ToList();
   post.Tags = tags;
} 

类似地,将帖子映射到标签。

这听起来像是您想要使用Dapper的"多个结果"功能。

  • https://github.com/StackExchange/dapper-dot-net#multiple-结果
  • 使用Dapper.NET在一次往返中执行多个SQL语句
  • Dapper.NET和具有多个结果集的存储过程

好的。感谢所有对我帮助很大的答案。以下是我的问题的完整答案:

using (var sqlConnection = new SqlConnection(Consts.ConnectionString))
        {
            var lookup = new Dictionary<long, Post>();
            sqlConnection.Query<Post, Tag, Post>(@"
            SELECT P.*, T.*
            FROM Post P
            INNER JOIN PostTag PT ON (P.Id = PT.PostId)
            INNER JOIN Tag T ON PT.TagId = T.Id", (p, t) =>
                                                {
                                                    Post post;
                                                    if (!lookup.TryGetValue(p.Id, out post))
                                                    {
                                                        lookup.Add(p.Id, post = p);
                                                    }
                                                    if (post.Tags == null)
                                                        post.Tags = new List<Tag>();
                                                    post.Tags.Add(t);
                                                    return post;
                                                }).ToList();
            var resultList = lookup.Values;
        }