2010-03-18 4 views
1

la méthode ToSelectList je:problème prédicats ToSelectList

public static IList<SelectListItem> ToSelectList<T>(this IEnumerable<T> itemsToMap, Func<T, string> textProperty, Func<T, string> valueProperty, Predicate<T> isSelected) 
{ 
    var result = new List<SelectListItem>(); 

    foreach (var item in itemsToMap) 
    { 
     result.Add(new SelectListItem 
     { 
      Value = valueProperty(item), 
      Text = textProperty(item), 
      Selected = isSelected(item) 
     }); 
    } 
    return result; 
} 

quand je l'appelle cette méthode ici:

public static List<SelectListItem> lesgeverList(int selectedID) { 
     NASDataContext _db = new NASDataContext(); 
     var lesg = (from l in _db.Lesgevers 
        where l.LG_Naam != "leeg" 
        orderby l.LG_Naam 
        select l).ToSelectList(m => m.LG_Naam + " " + m.LG_Vnaam, m => m.LG_ID.ToString(), m => m.LG_ID == selectedID); 
     return lesg.ToList(); 
    } 

le List<SelectListItem> je reçois a le selectedID comme sélectionné.

maintenant, quand je veux avoir plusieurs éléments sélectionnés, je donne une liste des Lesgevers

public static List<SelectListItem> lesgeverList(List<Lesgever> lg) { 
     NASDataContext _db = new NASDataContext(); 

     var test = (from l in _db.Lesgevers 
        where l.LG_Naam != "leeg" && lg.Contains(l) 
        orderby l.LG_Naam, l.LG_Vnaam 
        select l).ToList(); 

     var lesg = (from l in _db.Lesgevers 
        where l.LG_Naam != "leeg" 
        orderby l.LG_Naam, l.LG_Vnaam 
        select l).ToSelectList(m => m.LG_Naam + " " + m.LG_Vnaam, m => m.LG_ID.ToString(), m => lg.Contains(m)); 
     return lesg.ToList(); 
    } 

le var test ne retourne le Lesgevers que j'ai dans la liste des atterrisseur, dans mon var lesg, il n'y a pas SelectListItem de sélectionné du tout.

où est mon erreur? :) comment réparer le thix?

Répondre

1

Je suppose que NASDataContext est un contexte de données Linq-to-SQL ou Linq-to-Entities. Dans la sélection var test, lg.Contains(l) est évaluée dans le cadre des expressions linq, ce qui signifie qu'elle sera traduite en SQL et exécutée sur le serveur SQL. Cela laisse au serveur SQL de déterminer l'égalité pour l'instruction contains. Il sera probablement converti en une clause WHERE IN (...) en utilisant la clé primaire de la table Lesgever.

Dans votre méthode ToSelectList, vous utilisez à la place l'égalité d'objet dans le prédicat isSelected. Les éléments de la liste seront de nouveaux objets créés par le contexte de données. Même s'ils correspondent à la même entité que les objets de la liste lg, ils ne seront pas les mêmes objets. Essayez d'ajuster votre prédicat m => lg.Contains(m) pour comparer sur les clés de l'article, au lieu de l'objet objet lui-même. Vous pouvez également implémenter l'interface IEquatable<T> pour que votre isSelected utilise votre propre définition d'égalité. Si je travaille avec les touches (int) alors cela fonctionne comme prévu.

+0

Merci – Stefanvds

Questions connexes