0

linqtoエンティティで動作するWhereIn句を取得しようとしていますが、問題が発生しました。私の問題は、さまざまなエンティティのリストがいくつかあることです。これらのリストからゲームエンティティのセットを選択して、基本的にSQLWHEREIN句を設定します。問題は、エンティティのリストが、多対多の関係を持つゲームエンティティの関連エンティティと比較されていることです。私は多くの研究を行い、これを解決するためにたくさんの解決策を試しましたが、それを完全に正しくすることはできません。stackoverflowコミュニティからの助けを本当に感謝します。

前もって感謝します。

編集:

私は組合の代わりにこれをやってみました:

     var relatedGames = from game in ugdb.Games
                        where game.Developers.Any(d => relatedDevelopers.Any(r => r.DeveloperID == d.DeveloperID))
                        || game.Publishers.Any(d => relatedPublishers.Any(r => r.PublisherID == d.PublisherID))
                        || game.Genres.Any(d => relatedGenres.Any(r => r.GenreID == d.GenreID))
                        select game;

ユニオンとこれの両方で、次のエラーメッセージが表示されます。

base {System.SystemException} ={"タイプ'UltimateGameDB.Domain.Entities.Developer'の定数値を作成できません。このコンテキストでは、プリミティブタイプ(' Int32、String、Guid'など)のみがサポートされます。"}

誰かがこれをせずにこれを行う方法を知っていますか

私の現在のコード:

  public IQueryable<Video> GetSimilarVideos(Guid videoId)
  {
     IQueryable<Video> result = null;
     List<Video> similarVideoList = null;

     Video currentVideo = ugdb.Videos.Find(videoId);

     List<Genre> relatedGenres = new List<Genre>();
     List<Developer> relatedDevelopers = new List<Developer>();
     List<Publisher> relatedPublishers = new List<Publisher>();

     foreach (var game in currentVideo.Games)
     {
        relatedDevelopers.AddRange(game.Developers);
        relatedPublishers.AddRange(game.Publishers);
        relatedGenres.AddRange(game.Genres);
     }

     relatedDevelopers = relatedDevelopers.Distinct().ToList<Developer>();
     relatedPublishers = relatedPublishers.Distinct().ToList<Publisher>();
     relatedGenres = relatedGenres.Distinct().ToList<Genre>();

     //This is the piece I am having trouble with!
     var relatedGames = from game in ugdb.Games
                        where game.Developers.Union(relatedDevelopers).Count() > 0
                          || game.Genres.Union(relatedGenres).Count() > 0
                          || game.Publishers.Union(relatedPublishers).Count() > 0
                        select game;

     foreach (var game in relatedGames)
     {
        similarVideoList.AddRange(game.Videos.Where(v => v.VideoType.Equals(currentVideo.VideoType)));
     }

     result = similarVideoList.Distinct().AsQueryable<Video>();

     return result;
  }
4

2 に答える 2

3

ローカルエンティティを渡すことはできません。ローカルエンティティはsqlに変換されません。この場合、relatedDevelopersです。LinqtoEntitiesをSQLに変換する方法はありませrelatedDevelopers.ContainsIN

ゲームのリストをキャストし、メモリ内で呼び出しを実行して、SQLに変換する必要がないようにすることができます-これは簡単ですが、データベースが巨大な場合は、すべてをロードするのは悪いかもしれませんToList()。最後に追加するだけです。のugdb.Games

 var relatedGames = from game in ugdb.Games.ToList()
                    where game.Developers.Any(d => relatedDevelopers.Any(r => r.DeveloperID == d.DeveloperID))
                    || game.Publishers.Any(d => relatedPublishers.Any(r => r.PublisherID == d.PublisherID))
                    || game.Genres.Any(d => relatedGenres.Any(r => r.GenreID == d.GenreID))
                    select game;

または、IDのリストを作成して渡すこともできます。これは、SQLが認識できるプリミティブ型であるためです。

     var relatedDevelopers = currentVideo.Games.SelectMany( g => g.Developers ).Select( g => g.DeveloperID ).ToArray();
     var relatedPublishers = currentVideo.Games.SelectMany( g => g.Developers ).Select( g => g.DeveloperID ).ToArray();
     var relatedGenres = currentVideo.Games.SelectMany( g => g.Developers ).Select( g => g.DeveloperID ).ToArray();


     //This is the piece I am having trouble with!
     var relatedGames = from game in ugdb.Games
                        where game.Developers.Any( d => relatedDevelopers.Contains(d.DeveloperID) )
                        || game.Publishers.Any( d => relatedPublishers.Contains(d.PublisherID))
                        || game.Genres.Any( d => relatedGenres.Contains(d.GenreID) )
                        select game;
于 2012-08-24T03:24:33.360 に答える
2

パターンは通常、ネストされたAny、またはを使用AnyすることですContains

var relatedDeveloperIds = relatedDevelopers.Select(r => r.Id).ToList();
game.Developers.Any(d => relatedDeveloperIds.Contains(d.Id))
于 2012-08-23T01:00:08.833 に答える