2010-10-26 35 views
6

Vì vậy, tôi có một đối tượng Blog có danh sách các đối tượng thẻ (List<Tag>).Cách thực hiện WHERE IN in linq

Tôi đang cố gắng tạo phương thức lấy danh sách các thẻ và trả về danh sách các blog chứa tất cả các thẻ trong danh sách được chuyển vào.

Tôi đã có thể tạo một phương thức sẽ trả về danh sách các blog nếu nó khớp với một thẻ, nhưng không phải danh sách các thẻ.

để làm điều đó tôi có điều này

entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tagName)) 

Nhưng tôi không thể tìm ra cách để làm điều gì đó như thế này

entities.Blogs.Where(b => b.Tags.Any(t => t.Name == tags[0] AND t.Name == tags[1] AND t.Name == tags[2] etc.......)) 

Có cách nào để làm điều này?

Cảm ơn bạn!

Tôi đang sử dụng LINQ to Entities

+0

Bạn có nghĩa là bạn đang tìm kiếm các blog chứa ít nhất một thẻ từ mảng thẻ không? Hay bạn đang cố gắng tìm các blog chứa tất cả các thẻ từ mảng thẻ? – MerickOWA

+0

Tôi nghĩ rằng nó sẽ tạo ra nó để nó chỉ trả về một cái gì đó có một thẻ phù hợp với mọi thứ trong danh sách của bạn. – BlackICE

+0

Tôi đang cố gắng tìm các blog chứa tất cả các thẻ từ mảng thẻ – hanesjw

Trả lời

11

Một cách logic, tôi nghĩ rằng bạn muốn một cái gì đó như:

entities.Blogs.Where(b => tags.All(t => b.Tags.Any(bt => bt.Name == t))) 

Hoặc:

HashSet<string> tagNames = new HashSet<string>(tags); 
return entities.Blogs 
       .Where(b => tagNames.IsSubsetOf(b.Tags.Select(x => x.Name))); 

Nếu đây là sử dụng LINQ to Entities, tôi nghi ngờ rằng điều này sẽ làm việc - nhưng nó sẽ hoạt động nếu bạn chỉ sử dụng LINQ to Objects. Thậm chí sau đó, nó sẽ không có hiệu quả khủng khiếp. Tôi nghi ngờ có một cách hiệu quả hơn để làm việc, nhưng tôi không thể ngay lập tức nghĩ về nó ... nó cảm thấy như bạn muốn tham gia, nhưng sau đó nó được khôn lanh một lần nữa.

+0

Jon Skeet là MAN! Cảm ơn bạn JS. Tùy chọn đầu tiên làm việc tuyệt vời. – hanesjw

1

Bạn có thể làm một cái gì đó như thế này:

List<Tag> tags = GetTags...; 
IQueryable<Blog> blogs = entities.Blogs; // start with all 
foreach(var tag in tags){ 
    var thisTag = tag; //this is needed to prevent a bug 
    blogs = blogs.Where(entry=>entry.Tags.Any(entryTag=>entryTag.TagId==thisTag.TagId)); 
} 
return blogs.OrderBy....; 

Điều này sẽ xích lại với nhau các khoản đâu để yêu cầu tất cả các khóa có mặt cho một blog entry để được trả lại.

Các vấn đề liên quan