私の質問は次のとおりです。ナビゲーション プロパティのデフォルトのサーバー側「フィルター」をどのように実装できますか?
私たちのアプリケーションでは、実際にデータベースから何かを削除することはめったにありません。Deleted
代わりに、各テーブルにビット列がある「ソフト削除」を実装します。この列が true の場合、レコードは「削除」されています。false の場合、そうではありません。
これにより、クライアントによって誤って削除されたレコードを簡単に「元に戻す」ことができます。
現在の ASP.NET Web API は、クライアントからdeleted
引数が送信されない限り、デフォルトで「削除されていない」レコードのみを返しtrue
ます。これは、サービスの利用者が、削除されていないアイテムのみが必要であると指定することを心配する必要がないという考え方です。
これと同じ機能を Breeze に実装するのは、少なくともベース エンティティの場合は非常に簡単です。たとえば、「削除済み」ビット フィールドを追加して、従来の Todo の例を実装すると、次のようになります。
// Note: Will show only undeleted items by default unless you explicitly pass deleted = true.
[HttpGet]
public IQueryable<BreezeSampleTodoItem> Todos(bool deleted = false) {
return _contextProvider.Context.Todos.Where(td => td.Deleted == deleted);
}
クライアント側で行う必要があるのは...
var query = breeze.EntityQuery.from("Todos");
...削除されていないすべての Todo を取得するには、または...
var query = breeze.EntityQuery.from("Todos").withParameters({deleted: true})
...削除されたすべての Todo を取得します。
しかし、BreezeSampleTodoItem に、その Todo を完了するために必要なツールの子コレクションがあるとします。これを「ツール」と呼びます。ツールは論理的な削除も実装します。ツールで Todo を取得するために使用するクエリを実行するexpand
と、すべてのツールが「削除済み」かどうかにかかわらず返されます。
しかし、展開されたときにデフォルトでこれらのレコードを除外するにはどうすればよいTodo.Tools
ですか?
展開が必要な項目ごとに個別の Web API メソッドを用意することにしました。たとえば、次のようになります。
[HttpGet]
public IQueryable<Todo> TodoAndTools(bool deletedTodos = false, bool deletedTools = false)
{
return // ...Code to get filtered Todos with filtered Tools
}
別の SO 投稿でこれを行う方法のサンプル コードを見つけましたが、Todo の各プロパティを手作業でコーディングする必要があります。上記の投稿のコードも、List
ではなくを返しますIQueryable
。さらに、これには、考えられるすべての拡張に対してメソッドを追加する必要があり、クールではありません。
基本的に私が探しているのは、クエリが実行されるたびに呼び出されるコードとTodos
、クエリが実行されるたびに呼び出されるコードを定義する方法Tools
です。できれば、削除されたアイテムを返す必要があるかどうかを定義する引数を渡すことができます。これは、サーバー側スタックのどこにでもある可能性があります - Web API メソッド自体、または Entity Framework の一部である可能性があります (インクルード拡張機能のフィルタリングは EF ではサポートされていないことに注意してください)。