Dapper Multi Mapping не разделяется на именованные параметры - PullRequest
0 голосов
/ 27 октября 2019

Новый для Dapper здесь! Возникли проблемы с мульти-картографированием. Это мой запрос:

var sql = @"select distinct a.*, 
                c.Id as 'GenreId', c.Active as 'GenreActive', c.Link as 'GenreLink', c.Name as 'GenreName', c.DateCreated as 'GenreDateCreated', c.DateEdited as 'GenreDateEdited',
                d.Id as 'CommentId', d.ReviewId as 'CommentReviewId', d.Name as 'CommentName', d.Email as 'Comment.Email', d.Content as 'CommentContent', d.Active as 'CommentActive', d.DateCreated as 'CommentDateCreated', d.DateEdited as 'CommentDateEdited', d.CommentId as 'ReplyCommentId' 
                from Review a " +
               "left join ReviewGenre b on a.Id = b.ReviewId " +
               "left join Genre c on c.Id = b.ReviewId " +
               "left join Comment d on a.Id = d.ReviewId " +
               "where a.Active = 1 " +
               "order by a.DatePublished desc;"
            ;

А мои сущности (сокращены для краткости):

public class Review 
{
    public int Id {get;set;}
    public IEnumerable<Genre> Genres { get; set; }
    public IEnumerable<Comment> Comments { get; set; }
}

public class Genre 
{
    public int Id {get;set;}
    public string Name {get;set;}
}

public class Comment 
{
    public int Id {get;set;}
    public int Content {get;set;
}

Мой запрос с помощью Dapper пытается разделить переименованные столбцы для Genre.Id и Comment.Я бы. Похоже, что запрос работает нормально, за исключением того, что ни один из жанров и комментариев не соответствует классу Review. Вот как я пытаюсь выполнить запрос:

 using (var connection = new SqlConnection(_ConnectionString))
            {
                var reviews = await connection.QueryAsync<Review, Genre, Comment, Review>(
                    sql,
                    (review, genre, comment) =>
                    {
                        review.Genres = new List<Genre>();
                        review.Comments = new List<Comment>();

                        if (genre != null)
                        {
                            review.Genres.ToList().Add(genre);
                        }

                        if (comment != null)
                        {
                            review.Comments.ToList().Add(comment);
                        }

                        return review;
                    },
                    commandType: CommandType.Text,
                    splitOn: "GenreId,CommentId");

                return reviews;
            }

Я изучал все учебные пособия и SO по этому вопросу и не нашел, что может привести к тому, что сопоставление не произойдет.

IБуду признателен за любые предложения (новичок в Dapper). Спасибо!

1 Ответ

1 голос
/ 27 октября 2019

В этой строке

review.Genres.ToList().Add(genre);

вы создаете каждый раз новый список (.ToList()). Этот метод возвращает / создает новый экземпляр, но новый экземпляр никогда не возвращается обратно в свойство модели. Это как делать что-то вроде этого:

var list = new List<int>();
new List<int>().Add(1);

Два экземпляра являются отдельными объектами.

Что вы можете сделать, это изменить свои модели, чтобы они работали так (списки создаются при созданииобъекта):

public class Review 
{
    public int Id {get;set;}
    public List<Genre> Genres { get; set; } = new List<Genre>();
    public List<Comment> Comments { get; set; } = new List<Comment>();
}

, а затем добавьте такие элементы, как это:

review.Genres.Add(genre);

Или вы можете проверить оригинальный учебник Dapper , где они используют словарь какгосударственный менеджер по удалению дубликатов.

...