2017-09-18 13 views
0

私はタイプIQueryable<T>の方法を持っており、ここでは実装のあるに参加します。これは、Identtiyテーブルのユーザーと私のカスタムテーブルPersonalInformationは、ユーザー登録フィールドを拡張し、今私は自分のLINQクエリでこのメソッドを呼び出すといいです。はテーブル

IRepository<PersonalInformation> personRepository; 
IRepository<ApplicationUser> usersRepository; 
var query = personRepository.Get(); 
var test = usersRepository.Get() 
          .GroupJoin(query, 
            n => n.Id, 
            m => m.UserId, 
            (n, ms) => new { n, ms = ms.DefaultIfEmpty() }) 
          .SelectMany(z => z.ms.Select(m => new PersonalInfoModel 
          { 
           Name = m.Name, 
           LastName = m.LastName, 
           Email = z.n.Email 
          })); 

しかし、私は var test = usersRepository.Get()にエラーが発生している - System.NotSupportedException:ここに私のLINQのです。だからメソッドpersonRepositoryから取得するが良いと呼ばれるが、usersRepositoryメソッドはnullを返します。どこで私は間違いをしたのですか?ありがとう

+0

'' IRepository'のGET'メンバーですか? – NetMage

+0

@NetMageはいインターフェイスIRepository :IDisposable T:class とIQueryableがあります。 Get();私はlinqで異なる文脈エラーがあります –

+0

実際のタイプの 'usersRepository'は' IRepository'の 'Get'演算を実装していない可能性があります。私はそれが好きではありませんが、一部のクラスはインターフェイスを部分的に実装しています。 'personRepository'と' usersRepository'の本当のタイプは何ですか? – NetMage

答えて

0

2つの異なるデータベースコンテキストのクエリを組み合わせるとエラーが発生する可能性があります。カスタムPersonalInformationはおそらくカスタムDBContextにあり、UsersIdentityDBContextです。 this related questionを参照してください。

すべてのテーブルを同じコンテキストに移動できます。

  • あなたはコンテキスト間で団体の多くで終わる場合より効率的な
  • これらのテーブル間の将来の混乱を避けることができます。
  • この1つの例を機能させるためには、もっと複雑な解決策が必要です。

テーブルを個別にクエリし、メモリに結合します。

  • 膨大な数のユーザーがいる場合はスケーラビリティに劣ります。
  • These operators will cause EF to return the results so you can process in memory.

    var people = personRepository.Get().ToList(); 
    var users = usersRepository.Get().ToList(); 
    var infoModels = users.GroupJoin(people, 
               u => u.Id, 
               p => p.UserId, 
               (u, mp) => new { n, ms = ms.DefaultIfEmpty() }) 
             .SelectMany(z => z.ms.Select(m => new PersonalInfoModel 
             { 
              Name = m.Name, 
              LastName = m.LastName, 
              Email = z.n.Email 
             }));