Выберите теги сообщения с помощью Dapper dot net

1

У меня три таблицы в моей базе данных. 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()

Теги:
sql-server
dapper
orm

3 ответа

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

И аналогично сопоставлению сообщений с тегами.

  • 0
    все сводится к тому, пытается ли ОП прочитать одно Post сравнению с несколькими Post ; последний сложнее; для бывших - да, это будет делать
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;
        }
0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню