2016-09-23 39 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添加了!對不起,我不知道這是特別的因素。 –

相關問題