0

J'utilise deux référentiels dans mon service CommentService.Modèle de référentiel - Joindre des données provenant de deux tables

_commentRepository 
_userRepository 

Utilisation de la fonction _commentRepository.GetAll() Je reçois une liste de tous mes commentaires avec les informations suivantes: [Id], [Contenu], [ID utilisateur].

J'essaye de créer une liste avec tous les commentaires et certaines des informations d'utilisateur correspondantes pouvant être obtenues par _userRepository et les stocker dans un DTO.

public ListOutput<CommentUserDto> GetCommentsWithUserInformation() 
{ 
    var comments = _commentRepository.GetAll(); 

    // TODO: Add comment and user information to CommentUserDto. 

    return new ListOutput<CommentUserDto> 
    { 
     Items = Mapper.Map<List<CommentUserDto>>(comments) 
    }; 
} 

Comment est-ce que je peux faire ce travail?

Quelques idées possibles que je trouve:

  1. Création d'un _commentUserRepository
  2. En utilisant notamment de se joindre en quelque sorte les deux tables (j'utilise EF)
  3. Créez un gestionnaire dans ma couche de domaine qui prend soin de combiner la logique.

EDIT:

modèle Commentaire:

public class Comment 
{ 
    public virtual string Content { get; set; } 
    public virtual DateTime CreationTime { get; set; } 
    public virtual long UserId { get; set; } // Id of User that posted Comment (always filled in) 
} 

modèle utilisateur:

public class User { 
    public virtual string Name { get; set; } 
    public virtual string Surname { get; set; } 
    public virtual string Email { get; set; } 
    public virtual string Password { get; set; } 
} 

CommentUserDto: // Classe Accessible aux vues

public class CommentUserDto { 
    public string Content { get; set; } // from comment 
    public DateTime CreationTime { get; set; } // from comment 
    public string PosterName { get; set; } // from user 
    public string PosterSurname { get; set; } // from user 
} 
+0

Utilisez-vous entityframework? – freshbm

+3

Personnellement, j'aime avoir un référentiel pour chaque commentaire et utilisateur, puis au-dessus des dépôts, j'ai mes classes de service, qui me donnent l'objet combiné de ces deux dépôts. Si vous vous souciez d'utiliser Entity Framework, Inclure est également une option – Yogi

+0

Oui je suis (clarifierai en question). – Sam

Répondre

0

Vous n'avez pas besoin de faire l'une des trois options que vous mentionnez. Si vous avez une propriété de navigation de Commentaire à Utilisateur, vous pouvez gérer cela dans votre mapping. Quelque chose comme:

Mapper.CreateMap<Comment, CommentUserDto>().ForMember(dest => dest.UserName, opts => opts.MapFrom(src => src.User.UserName)); 

Si vous ne disposez pas d'une propriété de navigation, puis après votre cartographie initiale, boucle à travers la liste des dto objets et appelez la méthode _userRepository appropriée pour obtenir les informations d'utilisateur et renseigner les membres appropriés de l'objet dto de cette façon.

Modifier

Après avoir vu vos modèles, ce que je ferais (en supposant une propriété de navigation est pas une option) est quelque chose comme ceci:

var comments = _commentRepository.GetAll(); 

var results = new List<CommentUserDto>(); 

foreach(Comment comment in comments) 
{ 
    var user = _userRepository.Get(comment.userId); 
    var commentUserDto = new CommentUserDto 
    { 
     Content = comment.Content, 
     CreationTime = comment.CreationTime, 
     PosterName = user.Name, 
     PosterSurname = user.Surname 
    } 

    results.Add(commentUserDto); 
} 

return results; 
+0

Merci, comme je l'ai mentionné, la classe Comment a une propriété UserId. Essayer votre exemple maintenant. – Sam

+0

Dans votre exemple, le mappage est effectué entre le commentaire (a la propriété userid) et le commentUserDto (uniquement les champs nécessaires pour la vue). Mais qu'en est-il des informations utilisateur nécessaires qui doivent également être stockées dans CommentUserDto afin qu'elles soient accessibles par la vue. Le résultat devrait être une liste avec tous les commentaires et avec chaque commentaire les informations de l'utilisateur correspondant. – Sam

+0

Nous ne pouvons pas vous aider si vous ne publiez pas vos classes de modèle. Donc, s'il vous plaît, pouvez-vous mettre à jour votre question avec des classes de modèles pour Comment, User, et UserUserDto (il semble que je ne peux pas insister assez) – freshbm