2016-09-23 10 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

DefaultIfEmpty()呼び出しを追加し、その結果にnullをチェックし、LINQのに参加:

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 Server:SQL not available]オブジェクトの "。 –

+0

@GrapeJelly上記の「一般的な」LINQで動作するので、いくつかの 'nhibernate'タグを質問に追加することを検討することができます。 –

+0

@Ivan Stevenが追加されました!申し訳ありませんが、私はこれが具体的に要因となっているかどうかはわかりませんでした。 –

関連する問題