2012-05-19 40 views
81

Sử dụng LINQ, làm cách nào tôi có thể truy xuất danh sách các mục có danh sách thuộc tính khớp với danh sách khác?linq nơi danh sách chứa bất kỳ danh sách nào trong danh sách

Hãy ví dụ đơn giản này và mã giả:

List<Genres> listofGenres = new List<Genre>() { "action", "comedy" }); 
var movies = _db.Movies.Where(p => p.Genres.Any() in listofGenres); 

Trả lời

154

Âm thanh như bạn muốn:

var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres)).Any(); 

hoặc cung cấp vị trong Any gọi để làm điều đó tất cả trong một bước:

var movies = _db.Movies.Any(p => p.Genres.Intersect(listOfGenres)); 
+0

tôi đã cố gắng sử dụng truy vấn này cho hộp tìm kiếm, nó tìm kiếm bất kỳ ký tự trong cột PERSON_NAME, tôi đã nhận lỗi này: 'DbIntersectExpression đòi hỏi đối số với bộ sưu tập tương thích ResultTypes 'vì vậy tôi đã thử '.StartWith, .EndsWith, .Contains' từ [đây] (http://blogs.telerik.com/openaccessteam/posts/12-04-17/string-matching-in- linq.aspx) nó hoạt động, nhưng những gì có thể được thực hiện để sử dụng truy vấn của bạn – stom

+0

@stom: Chúng tôi không có đủ thông tin để giúp bạn với điều đó - bạn nên đặt một câu hỏi mới với ngữ cảnh * nhiều * hơn. –

+0

@JonSkeet Tôi luôn sử dụng phương pháp Chứa các loại truy vấn này. Tôi đã tò mò bằng cách nhìn thấy câu trả lời của bạn và kiểm tra việc thực hiện nội bộ và thấy rằng Intersect sử dụng Set. Bạn có thể cho tôi biết sự khác biệt về hiệu suất giữa hai phương pháp đó không? – Sreejith

42

Bạn có thể sử dụng truy vấn Contains cho điều này:

var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x)); 
0

Tôi đoán điều này cũng có thể như thế này?

var movies = _db.Movies.TakeWhile(p => p.Genres.Any(x => listOfGenres.Contains(x)); 

Có phải "TakeWhile" tồi tệ hơn "ở đâu" về hiệu suất hoặc độ rõ không?

+0

'TakeWhile' là một chức năng khác - nó sẽ dừng lặp lại khi nó không tìm thấy kết quả phù hợp. –

0

Hoặc như thế này

class Movie 
{ 
    public string FilmName { get; set; } 
    public string Genre { get; set; } 
} 

...

var listofGenres = new List<string> { "action", "comedy" }; 

var Movies = new List<Movie> {new Movie {Genre="action", FilmName="Film1"}, 
       new Movie {Genre="comedy", FilmName="Film2"}, 
       new Movie {Genre="comedy", FilmName="Film3"}, 
       new Movie {Genre="tragedy", FilmName="Film4"}}; 

var movies = Movies.Join(listofGenres, x => x.Genre, y => y, (x, y) => x).ToList(); 
Các vấn đề liên quan