2016-09-23 3 views
2

У меня возникают проблемы с запросом LINQ.LINQ Query не тянет все необходимые записи

Этот запрос создает список новых объектов на основе записей из репозитория. Вот исходный запрос:

var accounts = (from a in entityRepository.Queryable<Account>() 
       from l in a.ExternalLogins 
       select new 
       { 
        a.ID, 
        FullName = a.FirstName + " " + a.LastName, 
        Status = a.Status == AccountStatus.Closed ? Enums.Status.Inactive : Enums.Status.Active, 
        Login = new 
        { 
         ConnectionID = l.Connection.ID, 
         l.Connection.ConnectionType, 
         l.Identity  
        }, 
        a.AdminAccess, 
        a.Username, 
        a.Email 
       }).ToList(); 

Моя проблема заключается в том, что не все a имеют a.ExternalLogins. Запрос не вытягивает эти учетные записи из-за дополнительного из оператора from l in a.ExternalLogins. Я попытался модифицировать запрос:

var accounts = (from a in entityRepository.Queryable<Account>() 
       select new 
       { 
        a.ID, 
        FullName = a.FirstName + " " + a.LastName, 
        Status = a.Status == AccountStatus.Closed ? Enums.Status.Inactive : Enums.Status.Active, 
        Login = (from l in a.ExternalLogins 
        select new 
        { 
         ConnectionID = l.Connection.ID, 
         l.Connection.ConnectionType, 
         l.Identity  
        }), 
        a.AdminAccess, 
        a.Username, 
        a.Email 
       }).ToList(); 

Но я получаю «System.Reflection.AmbiguousMatchException» исключение. От взгляда на это исключение, я предполагаю, что причина в том, что и у Account, и у Connection есть поле ID.

Я направился в правильном направлении с этим? Я преследую это исключение, или мой запрос не правильный?

Прошу прощения, если это тривиально; Я новичок в запросах LINQ, и мои навыки Google не помогли мне в этот момент!

ответ

2

Чтобы сделать левое внешнее соединение в Linq, добавьте DefaultIfEmpty() вызов и проверить нуль в результатах:

var accounts = (from a in entityRepository.Queryable<Account>() 
      from l in a.ExternalLogins.DefaultIfEmpty() 
      select new 
      { 
       a.ID, 
       FullName = a.FirstName + " " + a.LastName, 
       Status = a.Status == AccountStatus.Closed ? Enums.Status.Inactive : Enums.Status.Active, 
       Login = (l == null) ? null : new 
       { 
        ConnectionID = l.Connection.ID, 
        l.Connection.ConnectionType, 
        l.Identity  
       }, 
       a.AdminAccess, 
       a.Username, 
       a.Email 
      }).ToList(); 
+0

Спасибо за ответ! Это имеет смысл, но когда я это пробовал, я получаю исключение «NHibernate.Exceptions.GenericADOException», в котором говорится: «Не удалось выполнить запрос [SQL: SQL not available]» с внутренним исключением »Ссылка на объект не установлена ​​в экземпляр объекта ". –

+0

@GrapeJelly. Вы можете подумать о добавлении некоторых тегов 'nhibernate' к вопросу, поскольку вышеупомянутое работает в« общем »LINQ. –

+0

@ Ивана Стивена Добавлено! Извините, я не знал, что это сыграло определенную роль в этом. –

Смежные вопросы