选择“使用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只是一个对象映射库,您必须自己编写原始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;
}