2009-04-04 12 views
5

Je souhaite supprimer un élément du résultat d'une requête LINQ avant de l'utiliser pour la connexion de données. Quelle est la bonne façon de faire cela?LINQ: Supprimer des éléments de IQueryable

Le foreach de mon illustration est le sujet de ma question. Illustration:

var obj = 
    (from a in dc.Activities 
    where a.Referrer != null 
    && a.Referrer.Trim().Length > 12 
    && a.Session.IP.NumProblems == 0 
    && (a.Session.UID == null || a.Session.UID < 1 || a.Session.User.BanLevel < 1) 
    select a) 
    .Take(int.Parse(ConfigurationManager.AppSettings["RecentItemQty"])); 
foreach (Activity act in obj) 
    if (isDomainBlacklisted(ref dc, act.Referrer)) 
     obj.Remove(act); 

Répondre

8

Vous n'avez pas besoin foreach vous pouvez simplement utiliser ...

obj.RemoveAll(act => isDomainBlackListed(ref dc, act.Referrer)); 
3

Vous pouvez juste le mettre à la fin de la requête pour les filtrer avant qu'ils ne finissent même dans le résultat:

var obj = 
    (from a in dc.Activities 
    where a.Referrer != null 
    && a.Referrer.Trim().Length > 12 
    && a.Session.IP.NumProblems == 0 
    && (a.Session.UID == null || a.Session.UID < 1 || a.Session.User.BanLevel < 1) 
    select a) 
    .Take(int.Parse(ConfigurationManager.AppSettings["RecentItemQty"])) 
    .Where(a => !isDomainBlacklisted(ref dc, a.Referrer)); 

vous pouvez mettre le Where avant la Take si vous souhaitez que d'autres éléments pour remplacer ceux filtrés, mais cela signifie que plus d'appels à isDomainBlacklist Ed bien sûr.

+0

Oui, c'est ce que j'ai fait. En fait, je l'ai mis dans la datasource = line. – tsilb

Questions connexes