2

Can I leverage the power of OData without EF?

I'm using an existing DB and creating my models using stored procedures to retrieve from DB.

AFAIK, when using $filter for example using OData with EF - the filter will be applied at the DB layer.

The way it works now is that all results are brought back from the DB and only then the filter is applied.

このように処理時間とサーバーの負荷が無駄になるので、必要な結果だけが返されるようにカスタマイズする方法を知りたいです。

たぶん、EFで作業する方が簡単でしょうか?

DB は非常に複雑です。ほとんどのモデル オブジェクトは、結合を使用してさまざまなテーブルから構築されています。

4

2 に答える 2

3

この返信は、フィルタリングと、それが内部でどのように機能するかに関するものであり、誰かにとって役立つかもしれません.

あなたが言った:

現在の動作方法は、すべての結果が 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 インターフェイスを介してこれらを「複雑なオブジェクト」として認識していると思いますが、確実に思い出すことはできません。

于 2014-01-10T14:22:35.153 に答える