2009-04-04 31 views
5

Tôi muốn xóa một mục khỏi kết quả của truy vấn LINQ trước khi sử dụng nó vào databind. Cách thích hợp để làm điều này là gì?LINQ: Xóa các mục khỏi IQueryable

Tìm kiếm trong minh họa của tôi là chủ đề của câu hỏi của tôi. Minh họa:

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

Trả lời

8

Bạn không cần foreach bạn chỉ có thể sử dụng này ...

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

Bạn chỉ có thể đặt nó ở phần cuối của các truy vấn để lọc chúng ra trước khi họ thậm chí kết thúc lên trong kết quả:

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

bạn có thể đặt các Where trước Take nếu bạn muốn các mặt hàng khác để thay thế những cái lọc ra, nhưng điều đó có nghĩa là nhiều cuộc gọi đến isDomainBlacklist ed tất nhiên.

+0

Vâng, đó là những gì tôi đã làm. Trên thực tế tôi đặt nó ngay trong dòng datasource =. – tsilb