2009-04-04 5 views
5

Я хочу удалить элемент из результата запроса LINQ перед его использованием в databind. Каков правильный способ сделать это?LINQ: удалять элементы из IQueryable

Предметом на моей иллюстрации является тема моего вопроса. Иллюстрация:

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

ответ

8

Вам не нужно Еогеасп вы могли бы просто использовать это ...

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

Вы можете просто положить его в конце запроса, чтобы отфильтровать их, прежде чем они даже конец в результате:

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

вы можете поставить Where перед Take если вы хотите другие элементы, чтобы заменить те, которые отфильтрованы, но это означает, что больше звонков в isDomainBlacklist конечно.

+0

Да, это то, что я сделал. На самом деле я правильно это применил в строке datasource =. – tsilb