LINQ: удалить элементы из IQueryable - PullRequest
5 голосов
/ 04 апреля 2009

Я хочу удалить элемент из результата запроса 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);

Ответы [ 2 ]

8 голосов
/ 04 апреля 2009

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

obj.RemoveAll(act => isDomainBlackListed(ref dc, act.Referrer));
3 голосов
/ 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.

...