Dapper 多映射不拆分命名参数

Dapper Multi Mapping Not Splitting on Named Parameters

这里是 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 的重命名列。除了 none 的流派和评论似乎映射到评论 class 之外,查询似乎工作正常。这就是我尝试执行查询的方式:

 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 的新手)。谢谢!

在这一行

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

您每次都在创建一个新列表 (.ToList())。此方法 returns/creates 新实例,但新实例永远不会分配回模型 属性。就像做这样的事情:

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

或者您可以查看 original dapper tutorial 他们在何处使用字典作为状态管理器来删除重复项。