次のフィールドを持つ MS SQL テーブルがあります。私はエンティティフレームワークを使用しています:
EntryId
EntryType
Operation
UpdatedTime_UTC
EntryId および EntryType フィールドには、重複する値を含めることができます。オブジェクトが作成されると、レコードが追加され、その「操作」フィールドが「追加」に設定されます。オブジェクトが変更されると、別のレコードが最初のレコードと同じ EntryId および EntryType 値で書き込まれますが、「操作」フィールドは「変更済み」に設定されます。オブジェクトが削除されると (ご想像のとおり)、別のレコードが以前のレコードと同じ EntryId および EntryType 値で書き込まれますが、「操作」フィールドは「削除済み」に設定されます。
いくつかのサンプル データを以下に示します。
ID1, Type1, “added”, 2012-08-20 09:15:50
ID2, Type1, “added”, 2012-08-21 09:15:50
ID1, Type1, “modified”, 2012-08-22 09:15:50
ID1, Type1, “modified”, 2012-08-23 09:15:50
ID2, Type1, “deleted”, 2012-08-24 09:15:50
これは、2 つのオブジェクト (ID1 と ID2) に関する情報を示しています。両方ともテーブルに追加されましたが、ID1 は変更され、ID2 は削除されました。調整手順の一環として、オブジェクトが削除された場合、操作が「削除済み」に設定された、一致する EntryId を持つレコードがテーブルに存在する必要があることを確認する必要があります。私のコードがない場合は、コードを追加します。
今私の問題に。システムが特定の「EntryType」のオブジェクトがないと判断したときに呼び出される関数があります。その「EntryType」のテーブル内のすべてのレコードに、「操作」が「削除」に設定されたレコードがあることを確認する必要があります。上記のデータでは、「ID1」には「削除済み」のエントリがありません。オブジェクトがまだ存在する場合は問題ありませんが、オブジェクトがなくなった場合は問題です。次の Linq を使用して、関心のある「entityType」を渡すグループ化されたリストを取得しています。
var item = _ctx.JournalSet
.Where(x => x.EntryType == entityType)
.OrderBy(x => x.UpdatedTime_UTC)
.GroupBy(x => x.EntryId);
次に、このコードを使用して各グループを調べ、「削除された」エントリがあることを確認します。そうでない場合は、テーブルに新しいレコードを追加します。
foreach (var item in result)
{
if (item.Last().Operation != "deleted")
{
// no 'deleted' entry found. time to add a new entry.
}
}
私がしたいのは、削除されたエントリを追加する必要がある場合にのみ EntryId と EntryType の詳細を返すように、Linq ステートメントを変更することです。
追加情報: 削除されたレコードは、常に「追加」または「変更」レコードより後の日付時刻を持つため、「UpdatedTime_UTC」で注文する場合、特定の entryId に存在する場合、最後のエントリは「削除」されたものである必要があります。
foreach を必要とせずに上記を実行する Linq ステートメントを作成することは可能ですか?