2009-04-04 13 views
5

Chcę usunąć element z wyniku zapytania LINQ przed użyciem go do databind. Jaki jest właściwy sposób na zrobienie tego?LINQ: Usuń elementy z IQueryable

Foreach na mojej ilustracji jest tematem mojego pytania. Ilustracja:

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); 

Odpowiedz

8

Nie trzeba się foreach można po prostu użyć tego ...

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

Wystarczy umieścić go na końcu zapytania, aby je odfiltrować, zanim jeszcze skończy w wyniku:

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)); 

można umieścić Where przed Take jeśli chcesz inne przedmioty, aby zastąpić te odfiltrowane, ale to oznacza więcej połączeń do isDomainBlacklist Oczywiście.

+0

Tak, właśnie to zrobiłem. Właściwie umieszczam to w linii danych = line. – tsilb

Powiązane problemy