Dapper Multi mapping映射不正确

问题描述 投票:0回答:1

我试图使用Dapper映射两个实体。就像这样:

你有桌子电影:MovieID,运行时,描述,标题,导演,流派

和表格投影:投影ID,时间,价格,霍尔,MovieID

电影有一个预测列表(每部电影有一个或多个投影)

连接后,电影的结果列表及其投影只是第一部电影和投影中的所有记录。

基本上,Movie1有两个预测Movie2有三个预测它返回五部电影的列表,所有这些都是第一部电影,所有这些都有五个投影。

有人可以帮助我在哪里犯错吗?

public List<Movie> ReturnMovieProjections()
{
    var list = new List<Movie>();
    var sql = "SELECT " +
                        "m.MovieID, " +
                        "m.Runtime, " +
                        "m.Description, " +
                        "m.Title, " +
                        "m.Director, " +
                        "m.Genres, " +
                        "p.MovieID, " +
                        "p.ProjectionID, " +
                        "p.Time, " +
                        "p.Price, " +
                        "p.Hall " +
                  "FROM Movie AS m INNER JOIN Projection AS p " +
                    "ON m.MovieID = p.MovieID " +
                  "WHERE p.MovieID = m.MovieID";

     using (var connection = new OleDbConnection(GetConnectionString("CinemaDB")))
     {
         var movieDictionary = new Dictionary<int, Movie>();
         list = connection.Query<Movie, Projection, Movie>(
         sql, (movie, projection) =>
         {
             Movie movieEntry;
             if (!movieDictionary.TryGetValue(movie.MovieID, out movieEntry))
             {
                 movieEntry = movie;
                 movieEntry.Projections = new List<Projection>();
                 movieDictionary.Add(movieEntry.MovieID, movieEntry);
             }
             movieEntry.Projections.Add(projection);
             return movieEntry;
         },
         splitOn: "p.MovieID").AsList();
        }
        return list;
    }
c# dapper
1个回答
0
投票

您应该返回字典值,而不是Dapper获得的IEnumerable。 该值将始终包含查询生成的所有5条记录

此外,不需要添加等于JOIN语句的WHERE条件

var sql = "SELECT " +
                "m.MovieID, " +
                "m.Runtime, " +
                "m.Description, " +
                "m.Title, " +
                "m.Director, " +
                "m.Genres, " +
                "p.MovieID, " +
                "p.ProjectionID, " +
                "p.Time, " +
                "p.Price, " +
                "p.Hall " +
          "FROM Movie AS m INNER JOIN Projection AS p " +
            "ON m.MovieID = p.MovieID ";
 using (var connection = new OleDbConnection(GetConnectionString("CinemaDB")))
{
    var movieDictionary = new Dictionary<int, Movie>();
    list = connection.Query<Movie, Projection, Movie>(sql, (movie, projection) =>
    {
         Movie movieEntry = null;
         if (!movieDictionary.TryGetValue(movie.MovieID, out movieEntry))
         {
             movieEntry = movie;
             movieEntry.Projections = new List<Projection>();
             movieDictionary.Add(movieEntry.MovieID, movieEntry);
         }
         movieEntry.Projections.Add(projection);
         return movie; // return the same instance passed by Dapper.
    },splitOn: "p.MovieID");
}
return movieDictionary.Values.ToList();
© www.soinside.com 2019 - 2024. All rights reserved.