2

ターゲットは、10 の人気のある映画のリストを取得することです。

populars以下を含むデータベースで 呼び出されるテーブルがあります。 moviecount- 映画がレンタルされた回数。 MovieID- 映画のID。

映画のすべてのデータを含む、Movies というテーブルもあります。このテーブルには、MovieID のフィールドが含まれています。テーブルは関連付けられていないため、テーブル間でリンクする必要はありません。

最も人気のある映画の 10 個の ID を取得しました

var TopTen = videoLibDB.populars
                 .Take(10)
                 .OrderBy(e => e.movieCount)
                 .Select(e => new { e.MovieID });

これは問題ありませんが、populars テーブル (上記のコードの TopTen) の 10 個の MovieID を使用して、"movies" テーブルから 10 個の最高の映画のリストを作成するにはどうすればよいですか?

ID が 1 つの場合、popular テーブルの moiveid と、movies テーブルの movieid を比較できます。

4

5 に答える 5

2

まず、取る前に必ず並べ替え (OrderBy) を行ってください。LINQ to SQL/EF では、これは重要ではないかもしれませんが、LINQ to Objects では最初の 10 行のみが評価されます。

第二に、人気者を映画に参加させるか、テーブル間の関連付けを使用する必要があります。関連付けが設定されていると仮定すると、次のようなことができるはずです。

var TopTen = videoLibDB.populars
             .OrderByDescending(e => e.movieCount)
             .Take(10)
             .Select(e => new { e.MovieID, e.Movie.MovieName});
于 2012-09-18T18:36:56.010 に答える
2

リレーションが正しく設定されている場合、上記の@JimWooleyの回答が最も簡単/最良です。このクエリは、その可能性がない場合に備えています。

linq クエリに問題があり、10 個のランダムな映画を取得して、それらのみをランク付けしています。このクエリはそれを修正し、movie テーブルと結合して最も人気のある映画を取得します。

var query = 
    from movie in videoLibDB.movies
    where
        videoLibDB.populars
        .OrderByDescending(x => x.movieCount)   // Sort all, most popular first
        .Take(10)                               // but only keep the 10 first
        .Select(x => x.MovieID)                 // Take their MovieID 
        .Contains(movie.MovieID)                // and get movie data on them
    select movie;
于 2012-09-18T18:43:54.370 に答える
0

INこれを試してみてください。句が生成されるはずです。

var results = from q in videoLibDB.movies
              where videoLibDB.populars
                    .OrderBy(e => e.movieCount)
                    .Take(10)
                    .Select(e => e.MovieID)
                    .ToArray()
                    .Contains(q.MovieID)
              select q

そして、こちらはさらに深く掘り下げた記事です。

于 2012-09-18T18:36:26.900 に答える
0

.Contains を使用

まず、ID を含む配列を作成します....

var ids = new[] { 1,2,3,4,5,6,7,8,9,10 };

次に、.Contains を使用します

var TopTen = videoLibDB.populars
    .Where(e => ids.Contains(e.MovieID)
    .OrderBy(e => e.movieCount)
    .Select(e => new { e.MovieID });

これは、T-SQL の IN ステートメントに相当します。

于 2012-09-18T18:37:49.197 に答える
0

テーブルがリンクされていない可能性があるという制限がある理由がわかりません...でもねえ...

var TopTen = videoLibDB.populars
       .OrderBy(e => e.movieCount)
       .Take(10)
       .Select(e => e.MovieID).ToArray();

var YourActualMovies = videoLibDB.movies
       .Where(x=>TopTen.Conatins(x.MovieID))
       .Select(...whatever you want...)
于 2012-09-18T18:43:35.193 に答える