2016-09-23 66 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查询的新手,我的谷歌技巧在这一点上已经失败了!

回答

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不可用]”,内部异常“对象引用未设置为实例的对象。“ –

+0

@GrapeJelly你可能会考虑在这个问题中增加一些'nhibernate'标签,因为上述工作在“一般”LINQ中。 –

+0

@Ivan Steven添加了!对不起,我不知道这是特别的因素。 –

相关问题