2017-10-16 2 views
2

Je réalise un projet de type webmail avec C#. J'ai un MultiSelectList dans lequel j'essaie de sélectionner tous les groupes dont l'utilisateur connecté est membre afin que l'utilisateur puisse les sélectionner et leur envoyer des messages, mais l'utilisateur n'est pas censé recevoir des groupes qui ne sont pas partie de.La requête C# .NET dans MultiSelectList ne fonctionne pas

Ce sont mes modèles:

public class Group 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<UserGroup> Users { get; set; } 
} 

public class ApplicationUser : IdentityUser 
{ 
    public DateTime LastLoggedIn { get; set; } 
    public int DeletedMessages { get; set; } 
    public int LoginCount { get; set; } 
    public virtual ICollection<UserGroup> Groups { get; set; } 
} 

public class UserGroup 
{ 
    [Key, ForeignKey("User")] 
    public string UserId { get; set; } 
    [Key, ForeignKey("Group")] 
    public int GroupId { get; set; } 

    public virtual ApplicationUser User { get; set; } 
    public virtual Group Group { get; set; } 
} 

Et c'est le MultiSelectList avec la requête:

ViewData["ToGroupName"] = new MultiSelectList(_context.Group.Where(group => 
group.Users.Where(user => user.UserId.Contains(currentUserID)) 
.Select(s => s.GroupId).FirstOrDefault() == group.ID), "ID", "Name"); 

J'utilise ApplicationDbContext avec DbSets <> pour sélectionner des éléments de la base de données. Ce que je ne comprends pas, c'est que j'utilise exactement la même requête dans une autre partie du code pour obtenir tous les groupes dont l'utilisateur fait partie, mais pour une raison quelconque, cela ne fonctionne pas ici. Au lieu de cela, il sélectionne tous les groupes qui se trouvent dans la base de données, que vous soyez membre ou non.

Je vous remercie de toute aide possible :)

+0

Il est possible que 'Contains()' renvoie plus d'un ID utilisateur, par ex. vous recherchez l'utilisateur "100" et renvoie "98100", "51009", etc. parce que l'ID de l'utilisateur est une chaîne. Alors, 'FirstOrDefault()' en obtient un. Envisagez d'utiliser Equals ou ==. – derloopkat

+0

En fait, j'avais l'intuition que cela pourrait être le cas, mais malheureusement, il n'a rien changé :( Mais merci pour la suggestion!: D – DarkCatapulter

Répondre

1

il semble que vous essayez de faire trop .. il suffit de vérifier pour voir si le groupe a des id utilisateur de qui correspondent à l'ID utilisateur actuel ..

vous pouvez utiliser l'

ViewData["ToGroupName"] = new MultiSelectList(_context.Group.Where(group => 
    group.Users.Any(user => user.UserId == currentUserID)), "ID", "Name"); 

Any retournera true si un élément de la collection répond à vos critères. Dans ce cas, si un UserGroup du groupe ICollection<UserGroup> Users a un UserId == currentUserID, incluez ce groupe dans le résultat.

+0

Je suis assez nouveau à C# .NET et j'ai eu beaucoup de mal Je vous remercie pour la requête améliorée, celle-ci est tellement plus facile à comprendre que celle que j'ai faite.Cette requête a travaillé sur une autre partie du code où j'essaie de faire exactement la même chose, mais il n'a pas Je commence à croire que ce n'est pas la requête qui est fausse, mais il y a autre chose qui agit bizarrement Merci pour votre aide! :) – DarkCatapulter

+0

J'ai réussi à trouver le problème et il est maintenant résolu, merci pour l'aide! :) – DarkCatapulter