2016-12-08 17 views
0

私は学校のプロジェクトを行っており、この最後の問題について助けが必要です。MVC多くのテーブルに2つのテーブルを追加し、結果に基づいてリストを作成する#

現在、私は多くの2つの結合を行い、結果を持つIEnumerableリストを埋めようとしています - linqとlambdaを使用しています。

目的は、すべての製品に互換性のあるゲームを表示することです。

今のように私のコード:

else 
     { 

      var result = (from g in db.Games 
          join gs in db.GameSize 
          on g.GameId equals gs.GameId 
          join s in db.Size 
          on gs.SizeId equals s.SizeId 
          join p in db.Product 
          on s.SizeId equals p.SizeId 
          select p.Size.Name); 

      games = db.Games 
       .Where(game => game.GameSize 
       .All(s => s.Size.Name == result.FirstOrDefault())); 

     } 

私の考えは、テーブルを通じて参加し、一致した商品コードを持つgameidを見つけることです - とし、「ゲーム」に追加します。

私は、この表のデザインがひどいこと、FirstOrDefault()で最初の結果しか得られていないことに気付いています。

私に手伝ってくれる提案や解決策はありますか?ありがとう。

私には意味がないかどうか質問してください。

本質的に私はちょうどサイズにリンクされたゲームを表示することを望んでいません。私のテーブルは次のようになります。

--SIZE 
insert into size values ('Large') 
insert into size values ('Medium') 
insert into size values ('Small') 

--GAMES 
insert into games values ('Magic The Gathering') 
insert into games values ('Pokemon') 
insert into games values ('Dead of Winter') 

--GAMESIZE (RELATION GAMES AND SIZE) (SIZEID, GAMEID) 
insert into gamesize values (1, 1) 
insert into gamesize values (2, 2) 
insert into gamesize values (2, 3) 

答えて

0

まず、LINQからSQLの構文に移ります。 EF構文ははるかに簡単で読みやすいです。たとえば、

var result = db.Games.Include("GameSize.Size.Product").Select(m => m.Size.Name); 

第2のAllは、あなたが思うようにはしません。ブール値を返します。すべての項目が条件に一致する場合はtrueを返し、そうでない場合はfalseを返します。 GameSizeのすべてが同じSize.Nameを持つことはほとんどありません。あなたはAnyを探しているかもしれません。

第3に、この全部が直感的ではないようです。あなたはすべてのゲームを受け取り、すべてのサイズの名前を選択しています。次に、そのサイズ名のリストを使用して、そのサイズの名前を持つゲームを選択します。言い換えれば、すでに得られた結果を得るために余分なクエリを実行しているということです。 resultから選択を削除し、その代わりにgamesを使用してください。これは私のkindofが同じ結果を与える

games = db.Games.Include("GameSize.Size.Product"); 
+0

ロングとショート、私はきちんとあなたのコードを理解していた場合、あなただけの1の単純なラインにこのすべてを減らすことができます。特定の製品に関連するものではなく、すべての製品のデータベース内のすべてのゲームを印刷します。 – MrBawsEnough

+0

さて、私はこれらのエンティティの外観をほとんど推測していますが、特定の製品に限定するためにwhere句を追加するだけです: 'db.Games.Include(...)。Where(m => m .GameSize.Size.Product.Id == productId) '。言い換えれば、すべてのデータを持っているので、探しているゲームだけを含める必要があります。 –

+0

私が持っている問題は、私がこれを作ることができないということです。それは、ゲームやサイズを商品と比較させません。私は、ユーザー入力 'if(size!= null) { games = db.Games .Where(game => game.GameSize .All(s =>))を持つ製品に正しいゲームを追加するのに似たようなものを作りました。 s.ize.Name == size)); } ' – MrBawsEnough

関連する問題