2009-04-04 32 views
5

Bir öğeyi bir LINQ sorgusunun sonucundan, veritabanına kullanmadan önce kaldırmak istiyorum. Bunu yapmanın doğru yolu nedir?LINQ: Öğeleri IQueryable'den kaldırın

Örneklemdeki foreach, sorumun konusudur. İllüstrasyon:

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

cevap

8

Sen sadece bu kullanabilirsiniz foreach gerekmez ...

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

Sadece onlar bile bitirmeden önce onları süzmek için sorgu sonunda koyabilirsiniz Sonuç yukarı:

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

sen filtre olanları değiştirmek için diğer öğeleri istiyorsanız Take önce Where koyabilirsiniz, ama bu isDomainBlacklist daha fazla arama anlamına gelir Elbette.

+0

Evet, öyle yaptım. Aslında veri kaynağına doğru koydum = satır. – tsilb