2017-05-11 8 views
0

Web APIプロジェクトにoDataを使用しています。これは私のコードです:web apiとodataパフォーマンス:データベースレベルでクエリを実行

[HttpGet]   
[EnableQuery] 
[Route("sessions")] 
public IQueryable<Session> Get() 
{ 
    var sessions = this.sessionRepository.GetAllSessions(); 
    return sessions.AsQueryable();   
} 

public class Session 
{ 
    public long Id {get;set;} 

    public string Name {get;set;} 
} 

これがうまく機能している:私はこれはmydomain/API /セッションのようなAPIを呼び出すと、私はこれはmydomain/APIのようなAPIを呼び出すと

は、私はすべてのセッション を取得します/ session?$ filter = Name eq 'session test'、私は 'session test'と同じ名前のセッションだけを取得します。

このコードの問題点は、ユーザーが実行した要求(フィルタ、フィルタ、トップなど)がなくても、最初に「select *」がdbで実行され、次にoDataからQueryableAttributeが実行されることです最初の大きなリクエスト "select *"から得られた結果に対してフィルタが実行されます。 私の質問は次のとおりです。つまり、ユーザーがdbで直接指定したクエリを実行し、まずselect *を実行せずにこの結果に対してフィルタを実行することが可能ですか?

ご協力いただきありがとうございます。

+0

がどのようにあなたはそれがクライアント側をフィルタリング知っていますか:

リポジトリのコードは次のようになりますか?バッキングストレージ/データベースとは何ですか? Entity Frameworkまたは別のORMを使用していますか? –

+0

私はエンティティフレームワークとSQLサーバを使用しています。私のコードをデバッグするとき、私のdbに行く唯一のリクエストはselect *です。セッションテーブルへ – user2443476

+1

GetAllSessions関数内にコードを表示できますか? –

答えて

0

本当にあなたのメソッドの戻り値の型によって異なります。 あなたのケースでは、Odataからフィルターを適用する前に照会がシリアル化されています。 これは、メソッドGetAllSessionsの戻り値の型がIQueryableであることを意味します。この場合、ODataフレームワークはEntity Framework経由でdbを呼び出します。

public IQueryable<Session> GetAllSessions() 
{ 
    return this._commonDataContext.Sessions.AsQueryable(); 
} 
関連する問題