2009-04-08 9 views
2

私はLINQクエリを持って存在しているにもかかわらず、フィルタリングありませんPARAM):。子コレクションが参加LINQ to SQLのは

var messageTypes = context.MessageTypes 
       .Join(
       context.MessageTypeField_MessageTypes, 
       mt => 
       new 
        { 
         MessageTypeID = mt.ID, 
         MessageTypeFieldID = messageTypeFieldID 
        }, 
       mtfmt => 
       new 
        { 
         MessageTypeID = mtfmt.MessageTypeID, 
         MessageTypeFieldID = mtfmt.MessageTypeFieldID 
        }, 
       (mt, mtfmt) => 
       new 
        { 
         mt = mt, 
         mtfmt = mtfmt 
        } 
       ) 
       .Where(x => (x.mt.StatusID == (int)status)) 
       .Select(x => x.mt); 

私はLINQが加わり、それは私が設定しています新しい正規化(多対多)テーブルで必要とされる状況に近づいて、私はすべてのメッセージタイプを戻したい学び始めましたはそれぞれ対応するフィールドは 'MessageTypeField_MessageType'の下に存在します。

私の「MessageTypeField_MessageTypes」テーブルには、このような非常に単純な正規化戦略の設定であると私はMessageTypeIDはそれができるので、それは固有のデータは「多くの持っている」にもかかわらず必ず明記してください:

[ID | MessageTypeID | MessageTypeFieldID] 
1 63  10 
1 63  11 
1 63  12 

今すぐ上記のコードの実行を私は満足しているクエリを返します。(正確なINNER JOINを実行します)しかし、1レコードが表示されると予想されるクイックウォッチで例えばmessageTypes.ToList()[0].MessageTypeField_MessageTypesを見ると、messageTypeField_MessageTypeレコードの全体のスタックが得られます〜17 、のみMessageTypeFieldIDによってフィルタリングされ、ではなくも同様である。各反復でメッセージタイプIDでフィルタリングし、1つのレコードだけを返します。私が間違ってやっていることに関するアイデアや、私が必要とするものをどのように達成できるのか?

ご迷惑をかけて申し訳ありませんが、皆さんのお役に立てれば幸いです。

答えて

3

ナビゲーションプロパティ(つまり、子コレクションの一部がmt)を見ている場合、これはクエリとは無関係です。 AssociateWithを使用するように思えます。クエリを変更すると、ナビゲーションプロパティとは無関係です、マルクが述べたように

select new 
{ 
    MessageType = mt, 
    MessageField = mtfmt 
} 

:これは主には、あなただけの子データをフィルタ処理しようとしている場合は参加を置き換え...

+0

ああ、あなたは冗談だよ!私はちょうどその複雑なクエリの良い時間を過ごした!ありがとうMarc!それは今、私が必要としていたことを正確に行います。私は簡単な方法が必要であることを知っていました。 – GONeale

+0

もっと簡単に:dlo.AssociateWith (mt => mt.MessageTypeField_MessageTypes.Where(mtfmt => mtfmt.MessageTypeFieldID == messageTypeFieldID)); もう一度ありがとうございます。私は実際にDataLoadOptionsクラスを見てください。;) – GONeale

+0

@GONealeはLoadWithと組み合わせて熱心に負荷をかけています:) ...また、それは唯一の方法ではありません。関係。 – eglasius

0

はにあなたの選択を変更することを検討してください。上記と似た何かが、あなたが意図したものでしょう。

ナビゲーションプロパティを使用する場合は、AssociateWithとLoadWithの組み合わせを使用する必要があります。最初のものをフィルターに、後のものを熱心なものにする(複数回の往復で終わらないように)。