2009-04-04 36 views
5

Quiero eliminar un elemento del resultado de una consulta LINQ antes de usarlo para enlazar datos. ¿Cuál es la forma apropiada de hacer esto?LINQ: eliminar elementos de IQueryable

El foreach en mi ilustración es el tema de mi pregunta. Ilustración:

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

Respuesta

8

No es necesario el foreach usted podría utilizar este ...

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

Usted puede sólo hay que poner al final de la consulta para filtrar hacia fuera antes de que incluso terminan en el resultado:

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

usted puede poner el Where antes de la Take si usted quiere otros artículos para reemplazar a los filtrados, pero eso significa más llamadas a isDomainBlacklist ed por supuesto.

+0

Sí, eso es lo que hice. En realidad, lo puse justo en el datasource = línea. – tsilb

Cuestiones relacionadas