Мульти-сопоставление Dapper не разделяется по именованным параметрам
Впервые в 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.Id. Запрос работает нормально, за исключением того, что ни один из жанров и комментариев не соответствует классу 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 по этому вопросу и не нашел, что может привести к тому, что отображение не произойдет.
Буду признателен за любые предложения (новичок в Dapper). Спасибо!
1 ответ
На этой линии
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, где они используют словарь в качестве диспетчера состояний для удаления дубликатов.