この返信は、フィルタリングと、それが内部でどのように機能するかに関するものであり、誰かにとって役立つかもしれません.
あなたが言った:
現在の動作方法は、すべての結果が DB から返されてからフィルターが適用されるというものです。
実際には、OData からデータを取得する方法が 2 つあります (私が遭遇した方法です)。1つは、データベースサーバーにすべてのデータを返してからフィルタリングさせることです(非常に非効率的です-これはあなたがほのめかしていると思います)。2 つ目は、OData パラメーターを EF を介して渡して、データベース レベルでフィルター処理することです。ページングなどの場合、フレームワークは合計レコード数を返します (2 つのクエリが実行されます)。
たとえば、特定のグループに属するユーザーのリストを表示するには、フィルター処理されたデータ リクエストは次のようになります。
url: "/api/Users?$filter=USERGROUPS/any(usergroup: usergroup/ID eq '" + groupData.ID + "')"
確認したいのは、OData オプションが EF データベース コンテキストに適用され、次のように実行できることです。
public IEnumerable<USER> Get(ODataQueryOptions<USER> options)
{
var unitOfWork = new ATMS.Repository.UnitOfWork(_dbContext);
var users = options.ApplyTo(unitOfWork.Repository<USER>().Queryable
.Include(u => u.USERGROUPS)
.OrderBy(order => order.USERNAME))
.Cast<USER>().ToList();
unitOfWork.Save(); // includes Dispose()
return users;
}
返されたデータを見ると、次のようになります。

あなたの場合、USER
エンティティを EF が作成する sproc エンティティに置き換えることができます。EDMX インターフェイスを介してこれらを「複雑なオブジェクト」として認識していると思いますが、確実に思い出すことはできません。