LINQ: удаление элементов из IQueryable

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

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

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

person tsilb    schedule 04.04.2009    source источник


Ответы (2)


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

obj.RemoveAll(act => isDomainBlackListed(ref dc, act.Referrer));
person bytebender    schedule 04.04.2009

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

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, если хотите, чтобы другие элементы заменили отфильтрованные, но это, конечно, означает больше вызовов isDomainBlacklisted.

person Guffa    schedule 04.04.2009
comment
Да, это то, что я сделал. На самом деле я указал это прямо в строке datasource=. - person tsilb; 04.04.2009