Dapper: несколько левых соединений с одним ко многим - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть 3 таблицы:

  • TimeLog.Столбцы: Id, ProjectId, TimeTypeId и другие ..
  • Проект.Столбцы: Id, Name и др ..
  • TimeType.Столбцы: Id, описания и многое другое ...

Я хочу получить несколько постов из таблицы TimeLog, а слева соединить ее с информацией из Project и TimeType.

Я использую Dapper «Мульти-отображение запросов (один ко многим)» (https://dapper -tutorial.net / query # example --- query-anonymous ).Когда я запускаю запрос, я получаю список из 20 элементов, каждый из которых имеет свойства TimeLog.project и TimeLog.TimeType.Но все остальные значения свойств либо нулевые, либо пустые.

Код:

string sQuery = $"SELECT TOP {_apiSettings.QueryLimit} T.*, P.Id, P.Name AS ProjectName, TP.Id, TP.Description AS TimeTypeDescription FROM [TimeLog] AS T";
            sQuery += " LEFT JOIN [Project] AS P ON T.ProjectId = P.Id";
            sQuery += " LEFT JOIN [TimeType] AS TP ON T.TimeTypeId = TP.Id";
            //sQuery += " WHERE T.IsActive = 1";
            //sQuery += " AND MONTH([Date]) = 8 AND YEAR([Date]) = 2019";

            var timeLogDictionary = new Dictionary<int, TimeLog>();

            using (var connection = new SqlConnection(_apiSettings.ConnectionString))
            {
                connection.Query<TimeLog, Project, TimeType, TimeLog>(sQuery, (timelog, project, timetype) =>
                {
                    TimeLog timelogEntry;

                    if (timeLogDictionary.TryGetValue(timelog.Id, out timelogEntry) == false)
                    {
                        timeLogDictionary.Add(timelog.Id, timelogEntry = timelog);
                    }

                    if (timelogEntry.Project == null)
                    {
                        if (project == null)
                        {
                            project = new Project();
                        } else
                        { 
                            timelogEntry.Project = project;                            
                        }
                    }

                    if (timelogEntry.TimeType == null)
                    {
                        if (timetype == null)
                        {
                            timetype = new TimeType();
                        }
                        else
                        {
                            timelogEntry.TimeType = timetype;
                        }
                    }

                    return timelogEntry;
                },splitOn: "ProjectId,TimeTypeId").ToList();
            }
...