Dapper Multi Mapping не отображается правильно - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь отобразить две сущности, используя Dapper. Это так:

У вас есть столик Фильм: MovieID, Продолжительность, Описание, Заглавие, директор, Жанры

и таблица проекции: ProjectionID, Время, Цена, Холл, 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;
    }

1 Ответ

0 голосов
/ 20 апреля 2019

Вы должны возвращать значения словаря, а не IEnumerable, полученный Dapper.
Это значение всегда будет содержать все 5 записей, созданных запросом

Также нет необходимости добавлять условие WHERE, равноена оператор JOIN

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