4

私はこのリポジトリメソッドを持っています:

public IQueryable<TModel> GetAll()
{
    using (var context = new DatabaseContext())
    {
        return context.Set<TModel>().AsQueryable();
    }
}

アーティストモデルはどこTModelですか.. とにかく

そして、コントローラーに次のアクションがあります。

// GET api/artist
[Queryable]
public IQueryable<ArtistModel> Get()
{
    return _repo.GetAll().AsQueryable();
}

今..リストを返すようにリポジトリメソッドを変更.ToListし、結果にも追加すると、これはうまく機能します。しかし、その後、どのような OData クエリが入ってきても..最初に「すべてのクエリを取得」を実行します..それらをリストに変換してから、そのリストに対して OData クエリを実行します..

これは単純に間違っているように思えます..私がやりたいことは、データベースからデータをフェッチしようとしているのと同時にODataクエリが実行されるようにすることです..そのため、クエリに一致する非常に具体的な結果のみが得られます..そして、後で照会される大量のデータではありません..

今のところ、使用の外で一度破棄されるという問題がありDbContextます..しかし、私はまだDbContextいくつかの場所で、いくつかの方法で..

何か案は?

4

2 に答える 2

3

いくつかの方法でクエリ可能な Web API を有効にすることができます。

  1. アクションに[Queryable]属性を付けます。アクションは、これらのいずれかを返すことができます - IEnumerable<T>, IQueryable<T>,HttpResponseMessageコンテンツはObjectContent<IQueryable<T>>またはObjectContent<IEnumerable<T>>, Task<IQueryable<T>>,Task<IEnumerable<T>>Task<HttpResponseMessage>あり、以前と同じ制限があります。

  2. を実行して、グローバルにクエリを有効にしconfiguration.EnableQuerySupport()ます。これにより、 を返すすべてのメソッドのクエリが可能になりますIQueryable<T>

  3. ここODataQueryOptions<T>で述べたように使用し、手動でクエリを自分で適用します。

また、DbContext破棄の問題に関しては、フォーマッターがストリームへの応答を書き込んでいるときに、非常に遅い方法でクエリを評価します。したがって、DbContextアクションで を破棄しないでください。代わりに、コントローラーと一緒に破棄します。つまり、コントローラーのDisposeメソッドをオーバーライドして、そこに破棄します。Web API はコントローラーの有効期間を管理し、要求の処理が完了するとコントローラーを破棄します。また、Request.RegisterForDisposeメソッドを使用して、リクエストの処理が完了したときにリソースを破棄することもできます。

于 2013-03-10T04:52:48.020 に答える
3

Web API のクエリ可能な拡張機能の最新バージョンは、以前のバージョンとは大きく異なるため、混乱を招きます。新しいバージョンでは、クエリ可能なサポートを明示的に有効にするか、新しいクエリ オプション クラスを使用する必要があります。これを見る

編集:私は今デスクにいるので、これをコード化する

public IQueryable<TModel> GetAll(ODataQueryOptions opts)
    {
        var db = _repo.GetAll();
        return (IQueryable<TModel>) opts.ApplyTo(db);
    }
于 2013-03-08T16:23:48.183 に答える