2017-09-18 5 views
0

J'ai une méthode de type IQueryable<T> et voici c'est la mise en œuvre:En utilisant IQueryable <T> avec LINQ joindre des tables

public IQueryable<T> Get() 
{ 
    return db.Set<T>(); 
} 

Je dois écrire requête LINQ où je veux joindre deux tables (joindre à gauche). Ce sont les utilisateurs de la table Identtiy et ma table personnalisée PersonalInformation qui étendent les champs d'enregistrement de l'utilisateur et maintenant je veux appeler cette méthode dans ma requête LINQ et c'est bien. Voici mon 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 
          })); 

Mais j'ai une erreur dans var test = usersRepository.Get()-System.NotSupportedException. Donc, la méthode Get de personRepository s'appelle bonne mais la méthode usersRepository retourne null. Où j'ai fait l'erreur ?? Merci

+0

est 'GET' un membre de' IRepository'? – NetMage

+0

@NetMage yes c'est l'interface IRepository : IDisposable où T: classe et il y a IQueryable Get(); J'ai une erreur de contexte différente dans linq –

+0

Il est donc possible que le type réel de 'usersRepository' n'implémente pas l'opération' Get' de 'IRepository'. Bien que je n'aime pas ça, certaines classes implémentent partiellement des interfaces. Quel est le vrai type de 'personRepository' et' usersRepository'? – NetMage

Répondre

0

Il est probable que vous rencontriez une erreur combinant des requêtes provenant de deux contextes de base de données différents. Votre PersonalInformation personnalisé est probablement dans un DBContext personnalisé tandis que Users est dans le IdentityDBContext. Voir this related question. Vous pouvez:

Déplacez toutes vos tables dans le même contexte.

  • évite toute confusion future entre ces tables
  • plus efficace si vous vous retrouvez avec beaucoup d'associations dans divers contextes.
  • Une solution plus impliquée juste pour que cet exemple fonctionne.

Interrogez vos tables séparément et combinez-les en mémoire.

  • Moins évolutif si vous avez un grand nombre d'utilisateurs.
  • 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 
             }));