私は最後のリビジョン以降にログを取得する変更ログクエリを作成しようとしています。Linq。GroupBy .Where。新しいグループ化アイテムを選択してください。
いくつかのルールに基づいてログを統合する必要があります。
ここに私の変更履歴モデルです:
public abstract class ChangeLogObject : TrackedObject {
/// <summary>
/// Type of transaction that occured
/// </summary>
public ChangeType ChangeType { get; set; }
/// <summary>
/// Original Id of the stateful object this changelog was created against
/// </summary>
public long EntityId { get; set; }
}
public enum ChangeType {
Created,
Updated,
Deleted
}
だから私はに必要な手順は次のとおりです。どこID>最後のリビジョン
グループによって実体識別子
ゲット
エンティティがChangeTypeを持つグループを戻しません.CreatedとChangeType.Deleted
- ChangeType.Deletedが、無ChangeType.CreatedがあるかどうChangeType.Updatedレコードを戻すしないでください
(グループからの更新されたレコードを削除します)のみ、最後の変更タイプを戻します.Updated記録倍数
がある場合、グループはChangeType.CreatedとChangeType.Updatedが含まれている場合は、最後のChangeType.Updatedを取り戻すが、ChangeType.Created
これは私が持っているどのくらいであるが、私は「グループの一部持ち帰る」するのか分からない。私はレコードのみを使用して新しいグループにXを有効にするにはどうすればよい4.について
var newChanges =
// 1. Get where greater than last revision
srcSet.Where(x => x.Id > lastRevision)
// 2. Group by EntityId
.GroupBy(x => x.EntityId)
// 3. Don't bring back created and deleted (it's come and gone)
.Where(x => !(x.Any(y => y.ChangeType == ChangeType.Created) &&
x.Any(y => y.ChangeType == ChangeType.Deleted)))
// 4. Only bring back Deleted if no created (don't edit something you're about to delete)
.Where(x => (!x.Any(y => y.ChangeType == ChangeType.Created) &&
x.Any(y => y.ChangeType == ChangeType.Deleted)))
//create new grouping, but only use the delete record????
//convert back to individual change logs
.Select(x => x.ToList()
//maybe order by ID?
.OrderBy(y => y.Id));
を/値はChangeType.Deletedです。グループ自体にChangeType.Createdが含まれていない場合は削除されますが、ChangeType.Updatedが含まれている可能性があります。私が作った
この大きなクエリを中間の結果変数を持つ小さなものに分割する方が簡単かもしれません – slawekwin
どういう意味ですか?すべての部品を個別に選択し、それらを結合しますか?またはそれらをメモリにプルしてから操作しますか? – Smithy