У меня три таблицы в моей базе данных. Post, Tag и PostTag. Таблицы Tag и Post имеют отношение Many To Many и из-за этой таблицы PostTag.
Мой вопрос в том, как я могу выбрать все сообщения в моей таблице с помощью своих тегов и результата карты для моего объекта POCO с помощью Dapper.net.
Вот мои классы 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;
}
И аналогично сопоставлению сообщений с тегами.
ОК. спасибо за все ответы, которые мне очень помогли. вот полный ответ на мой вопрос:
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;
}
Это похоже на то, что вы хотели бы использовать функцию "множественных результатов" Dapper.
Post
сравнению с несколькимиPost
; последний сложнее; для бывших - да, это будет делать