2009-04-04 5 views
5

LINQ 쿼리의 결과에서 항목을 제거한 다음 데이터 바인딩을 사용하고 싶습니다. 이 작업을 수행하는 적절한 방법은 무엇입니까?LINQ : IQueryable에서 항목 제거

내 그림에서 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); 

답변

8

당신은 단지 이것을 사용할 수있는 foreach는 필요하지 않습니다는 ...

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

당신은 당신이 필터링 사람을 대체 할 다른 항목을 원하는 경우 Take 전에 Where를 넣을 수 있습니다,하지만 isDomainBlacklist에 더 많은 통화를 의미 물론이지.

+0

그래, 내가 그랬다. 사실 나는 그것을 데이터 소스 = 라인에 넣었다. – tsilb