2016-09-06 1 views
0

Je suis nouveau à C#, ASP.NET, MVC, LINQ et presque tout ce que je fais. Nous avons développé un prototype opérationnel d'un système de planification d'événements qui répertorie tous les événements pour tous les sites sans tenir compte du site qui planifie quel événement. Nous adaptons le prototype à une version complète et souhaitons désormais que les planificateurs ne voient que les événements pour les sites qu'ils planifient. Ma première tentative consiste à remplir une liste d'entiers contenant l'ID des sites que le planificateur peut planifier. J'utiliserais ensuite .contains pour déterminer si les événements se trouvent dans la liste des sites de l'utilisateur connecté. J'ai donc la requête suivante qui fonctionne (notez que l'utilisateur ne peut pas encore sélectionner plusieurs sites, c'est pourquoi j'utilise .FirstOrDefault() parce que nous avons des problèmes de données avec lesquels nous travaillons avec le client. inclus la méthode complète plus bas):Retour d'une liste d'entiers et en utilisant .contains()

int site = (from u in context.Employees 
    join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac 
    where u.User_ID == usr 
    select hf.siteID).FirstOrDefault(); 

var sites = new List<int> {site}; 

return sites; 

maintenant, je veux par défaut des rôles d'être en mesure de planifier tous les sites et c'est là que je commence à avoir des problèmes (méthode complète ici):

public List<int> GetUserSites(string usr) 
{ 
    try 
    { 
     using (var context = new DBcontext()) 
     { 
      if (HttpContext.Current.User.IsInRole("Owner") || HttpContext.Current.User.IsInRole("Controller")) 
      { 
       var everySite = (from s in context.Sites 
           select new List<int> { s.ID }); 

       return everySite; 

      } 
      var site = (from u in context.Employees 
       join hf in context.SiteHomeFacs on u.Default_Location_Code equals hf.HomeFac 
       where u.User_ID == usr 
       select new List<int> { hf.siteID }).FirstOrDefault(); 

      return sites; 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

L'erreur sur 'return everySite' est:

Impossible de convertir implicitement le type 'System.Linq.IQueryable>' en 'System.Collections.Generic.List'. Une conversion explicite existe (vous manque un casting?)

Pour moi, il semble contre-intuitif que la requête serait acceptable avec .FirstOrDefault(), mais pas sans elle. Quelqu'un peut-il m'aider à retourner une liste de valeurs entières afin que je puisse utiliser .contains? Ou suggérer un meilleur moyen de tous?

Répondre

0

Afin de résoudre ce problème, vous pouvez le faire,

Ajouter un ToList() à la fin de convertir le résultat IQueryable retourné à un IList,

var everySite = from s in context.Sites select s.ID ;  
return everySite.ToList(); 

EDIT: Pour pour supporter une grande liste vous pouvez retourner un HashSet comme mentionné dans le commentaire ci-dessous,

return new HashSet<int>(everySite); 
+0

Si votre liste est longtemps et vous devez faire beaucoup de vérification, je voudrais utiliser un HashSet au lieu d'une liste - la performance est beaucoup mieux pour les recherches. retourne un nouveau HashSet (everySite); –

+0

@ShannonHolsinger Oui vous avez raison, ajouté! – Sajeetharan

+0

Il convient de mentionner que 'select new List {s.ID}' devrait être 'select s.ID'. –