2012-05-19 13 views
81

linqを使用すると、属性リストが別のリストと一致するアイテムのリストを取得するにはどうすればよいですか?linq listにリストが含まれています

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

答えて

154

は、あなたが望むような音:

この単純な例と擬似コードを取る

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

または一度にすべてを行うにはAny呼び出しで述語を提供する:

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

ように私は、検索ボックスのために、このクエリを使用しようとしていた、それはPERSON_NAME列内の任意の文字を検索し、私はこのエラーを得た:「DbIntersectExpressionが必要です引数は互換性のあるコレクションResultTypesであるため、私は '.StartWith、.EndsWith、.Contains'を[ここ]から試しました(http://blogs.telerik.com/openaccessteam/posts/12-04-17/string-matching-in- linq.aspx)は動作しますが、クエリを使用するために何ができるのですか? – stom

+0

@stom:十分な情報がありませんそれを手助けするために - あなたは*ロット*より多くの文脈で新しい質問をするべきです。 –

+0

@JonSkeet私は常にこれらの種類のクエリにContainsメソッドを使用します。あなたの答えを見て私は不思議で、内部の実装をチェックして、IntersectがSetを使用していることを発見しました。これら2つの方法のパフォーマンスの違いを教えてください。 – Sreejith

42

これにはContainsクエリを使用できます。

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

これも同様ですね。

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

「TakeWhile」はパフォーマンスや明快さの点で「Where」よりも悪いですか?

+0

'TakeWhile'は別の関数です。一致するものが見つからない場合は反復処理を停止します。 –

0

またはこの

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(); 
関連する問題