选择使用Dapper dot net发布标签

时间:2014-10-13 11:10:14

标签: c# sql sql-server orm dapper

我的数据库中有三个表。 Post,Tag和PostTag。标签和帖子表具有多对多关系,因为创建了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 =&gt; x.Tags).ToList()

3 个答案:

答案 0 :(得分: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;
} 

类似于将帖子映射到标签。

答案 1 :(得分:0)

答案 2 :(得分:0)

确定。感谢所有帮助我很多的答案。这是我的问题的完整答案:

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