【问题标题】:Select Post Tags with Dapper dot net选择带有 Dapper dot net 的帖子标签
【发布时间】:2014-10-13 11:10:13
【问题描述】:

我的数据库中有三个表。帖子、标签和帖子标签。 Tag 和 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()

【问题讨论】:

    标签: c# sql sql-server orm dapper


    【解决方案1】:

    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;
    } 
    

    同样将帖子映射到标签。

    【讨论】:

    • 这一切都归结为 OP 是否试图读取 one Post,而不是 multiple Posts;后者更复杂;对于前者 - 是的,就可以了
    【解决方案2】:
    【解决方案3】:

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

    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;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2014-06-30
      相关资源
      最近更新 更多