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 つのレコードのみを返す必要があります。私が間違っていること、または必要なものをどのように達成できるかについてのアイデアはありますか?MessageTypeFieldID
MessageTypeID
複雑な例で申し訳ありませんが、お役に立てれば幸いです。