2011-06-23 33 views
4

私はEntity Frameworkが新しく、マルチテーブル結合を変換してEntityフレームワークを使用しようとしています。元のSQLは次のようになりましたEntity Framework 4.1を使用したマルチテーブル結合、ラムダまたはLINQを使用する必要がありますか?

JOIN tab_NewsCommunities S1 ON S1.News_ID = tab_News.NewsID 
inner join tab_communities com on S1.Community_ID = com.Community_ID and com.RecordStatus_ID = 2 
JOIN tab_Communities c ON S1.Community_ID = c.Community_ID 
JOIN tab_Favorites uf ON S1.Community_ID = uf2.Community_ID 
     WHERE uf.[User_ID] = @UserId 

新しいエンティティモデルはこのように見えますが、私はそれをいくつか簡略化しました。誰か私はLINQまたはラムダにSQLを変換するのを助けることができますか?私は多くのサンプルをオンラインで見てきましたが、それらはすべて単一のテーブル結合です。おかげ

entity model

答えて

4

私はあなたがCRAIG STUNTZによってこのblog postを読むことをお勧めします。モデルに正しい関係がある限り、JOIN演算子に頼らずにナビゲーションリンクを使用してすべてのプロパティを選択することができます。そして正直なところ、これはLINQの美しさです。あなたのモデルがそれを実行できるのであれば、なぜあなた自身が参加するのですか?

+0

面白い読書、そして彼はどこに行くのですか。問題は、どのようにして2番目のテーブルへの参加が終了するかということです。 – NullReference

1

は、限り、あなたはEFデザイナーのテーブルwは、あなたがする必要はありません/ Bの関係を定義しているとして、再び合流します。関連するエンティティを熱心に読み込むだけです。

var result = context.News.Include("NewsCommunity.Communities") 
          .Include("NewsCommunity.Favorites") 
          .Where(n => n.NewsCommunity.Favorites.Any(f => f.UserId == userId));  
+0

お返事ありがとうございます。それが正しい軌道にあるように見えます。私はn.NewsCommunity.Community.Favoritesに問題があります。何か、NewsCommunityの後の何らかの理由で、それは私にCommunityナビゲーションプロパティのオプションを与えません。何か案は? – NullReference

1

最新のバージョンのEntity FrameworkでIncludeメソッド内のlamda式を使用できます。次に、セカンドセレクトを使用して、余分なレイヤーをリレーションシップの深みまで広げることができます。

var result = context.News.Include(x=>x.NewsCommunity.select(z=>z.Communities)).Where(...)