linqからsql:ソフト削除でネストされたオブジェクトをフィルター
-
04-10-2019 - |
質問
データベースでソフト削除を使用しています(IsDeleted
分野)。私は積極的に使用しています LoadWith
と AssociateWith
ネストされたレコードを取得およびフィルタリングする方法。
事は AssociateWith
1対多くの関係を表すプロパティでのみ動作します。
DataLoadOptions loadOptions = new DataLoadOptions();
loadOption.LoadWith<User>(u = > u.Roles);
loadOption.AssociateWith<User>(u = > u.Roles.Where(r = > !r.IsDeleted));
上記の例では、次のように言います。 関連する(未定の)役割を持つユーザーを取得したい.
しかし、私が1対1の関係を持っているとき、例えば Document
-> File
(1つのファイルのみがドキュメントに関連しています)ソフト削除されたオブジェクトをフィルタリングできません:
DataLoadOptions loadOptions = new DataLoadOptions();
loadOption.LoadWith<Document>(d = > d.File);
// the next certainly won't work
loadOption.AssociateWith<File>(f = > !f.IsDeleted);
それでは、1対1の関係内でレコードをフィルタリングする方法はありますか?
ありがとう!
解決
これまでのところ、これに適したソリューションは1つだけでした(ソフトデレクトをまったく使用しないこととは別に)。エンティティアップデートでソフト削除関係を削除すること。
たとえば、ドキュメントからファイルを削除することにしたとき、次のようなものを実行します。
// this may be a part of update method
var file = document.File;
if (file.IsDeleted)
{
// attach soft deleted file
context.Files.Attach(file, true);
// remove a file reference
document.File = null;
}
// attach document entity and submit changes
context.Documents.Attach(document, true);
context.SubmitChanges();
したがって、これは複雑なデータ取得の1対1の関係フィルタリングに代わるものかもしれません。
他のヒント
多分試してみてください:
loadOptions.AssociateWith<File>(f => f.IsDeleted ? null : f);
これにより、ISDELETEDがTRUEであるファイルの代わりにNULLが表示されます。
所属していません StackOverflow