我的数据库中有三个表。 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()
答案 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)
这听起来像你想要使用Dapper的“多重结果”功能。
答案 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;
}