3

LINQ クエリがあります。

var result = from mt in MessageTypes
            join mtfmt in MessageTypeField_MessageTypes
                on new { MessageTypeID = mt.ID, MessageTypeFieldID = messageTypeFieldId } equals new { MessageTypeID = mtfmt.MessageTypeID, MessageTypeFieldID = mtfmt.MessageTypeFieldID }
            where (mt.StatusID == (int)status)
            select mt;

または、必要に応じて Lambda 構文 (私が使用しているもの) (messageTypeFieldIDパラメーターからの var 呼び出しの上に設定されています):

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 recordmessageTypes.ToList()[0].MessageTypeField_MessageTypesが表示されると予想されますが、 messageTypeField_MessageType レコードのスタック全体を取得しています〜17、フィルターのみで、フィルターではありません。反復ごとにメッセージ タイプ ID でフィルタリングし、1 つのレコードのみを返す必要があります。私が間違っていること、または必要なものをどのように達成できるかについてのアイデアはありますか?MessageTypeFieldIDMessageTypeID

複雑な例で申し訳ありませんが、お役に立てれば幸いです。

4

2 に答える 2

3

ナビゲーション プロパティ (つまり、 の子コレクションmt) を見ている場合、これはクエリとは関係ありません。を使いたいようですAssociateWith。子データをフィルタリングしようとしているだけの場合、これは主に結合に取って代わります...

于 2009-04-08T07:14:30.410 に答える
0

選択を次のように変更することを検討してください。

 select new 
 {
    MessageType = mt,
    MessageField = mtfmt
 }

Marc が述べたように、クエリの変更はナビゲーション プロパティとは無関係です。上記のようなものは、おそらくあなたが意図したものです。

ナビゲーション プロパティに固執する場合は、AssociateWith と LoadWith を組み合わせて使用​​する必要があります。最初にフィルタリングし、後で熱心なロードにします (複数のラウンド トリップで終了しないようにします)。

于 2009-04-08T07:34:41.720 に答える