2016-09-23 1 views
2

LINQ 쿼리에 문제가 있습니다.LINQ 필요한 모든 레코드를 가져 오지 않는 쿼리

이 쿼리는 리포지토리의 항목을 기반으로 새 개체의 목록을 만듭니다. 다음은 원래 쿼리입니다 :

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

내 문제는 모든 aa.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'예외가 발생합니다. 그 예외를 살펴본 결과, AccountConnection에 모두 ID이 있기 때문에 그 이유가 무엇인지 추측합니다.

나는 이것을 올바른 방향으로 향하고 있습니까? 이 예외를 추적합니까 아니면 내 쿼리가 올바르지 않습니까?

사소한 경우 사과드립니다. 나는 LINQ 질의에 익숙하지 않고, 나의 Google 기술은 나에게이 시점에서 실패했다!

답변

2

는 왼쪽 외부, Linq에에 조인 DefaultIfEmpty() 전화를 추가하고 결과에 널 (null)를 확인하려면 다음을 수행

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을 사용할 수 없음]"내부 예외와 함께 "개체 참조가 인스턴스로 설정되지 않았습니다 개체의. " –

+0

@GrapeJelly 위의 코드는 "일반"LINQ에서 작동하기 때문에 질문에 'nhibernate' 태그를 추가하는 것을 고려해 볼 수 있습니다. –

+0

@Ivan Steven 추가되었습니다! 미안, 나는 그것이 구체적으로 요인을 연주하고 있었는지 몰랐다. –