Может ли выражение LINQ использовать LEFT JOIN или значение по умолчанию null, если элемент не найден? - PullRequest
2 голосов
/ 11 ноября 2011

Я пытаюсь отследить сбой в каком-то существующем коде в унаследованном веб-приложении. Я отследил это до одного выражения LINQ:

var projInfo = (from v in context.TPM_PROJECTVERSION
                join p in context.TPM_PROJECT on v.PROJECTID equals p.PROJECTID
                join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID
                join pt in context.TPM_PROJECTTYPES on p.PROJECTTYPEID equals pt.PROJECTTYPEID
                where v.PROJECTID == projectId && v.VERSIONID == versionId
                select new
                {
                    ProjectName = v.NAME,
                    ProjectType = pt.SHORTNAME,
                    ProjectDesc = v.DESCRIPTION,
                    BusinessLaunchData = p.BUSINESSLAUNCHDATE,
                    BusinessSponsor = (v.TPM_USER3.FIRSTNAME + " " + v.TPM_USER3.LASTNAME),
                    PrimaryTrainingOwner = (pto.FIRSTNAME + " " + pto.LASTNAME)
                }).First();

Ошибка «Последовательность»не содержит элементов ", которые я проследил до этой строки:

join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID

Если USER1 равен нулю, строка не возвращается.Вместо этого мне нужно, чтобы PrimaryTrainingOwner был просто нулевым или пустым.По сути, мне нужно сделать LEFT JOIN и проверить это при настройке PrimaryTrainerOwner.Есть ли способ обновить это выражение LINQ для обработки этого случая?Спасибо!

1 Ответ

1 голос
/ 11 ноября 2011

Я думаю, что нашел решение.Буду признателен за любые комментарии о том, является ли это лучший подход или синтаксис или что-то еще.Спасибо!

var projInfo = (from v in context.TPM_PROJECTVERSION
                join p in context.TPM_PROJECT on v.PROJECTID equals p.PROJECTID
                join pto in context.TPM_USER on v.TPM_USER1.USERID equals pto.USERID into primaryowner
                from subpto in primaryowner.DefaultIfEmpty()
                join pt in context.TPM_PROJECTTYPES on p.PROJECTTYPEID equals pt.PROJECTTYPEID
                where v.PROJECTID == projectId && v.VERSIONID == versionId
                select new
                {
                    ProjectName = v.NAME,
                    ProjectType = pt.SHORTNAME,
                    ProjectDesc = v.DESCRIPTION,
                    BusinessLaunchData = p.BUSINESSLAUNCHDATE,
                    BusinessSponsor = (v.TPM_USER3.FIRSTNAME + " " + v.TPM_USER3.LASTNAME),
                    PrimaryTrainingOwner = subpto == null ? String.Empty : (subpto.FIRSTNAME + " " + subpto.LASTNAME)
                }).First();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...