2012-02-28 26 views
2

の同等のパラメータ、接続プロパティ、私たちは以下のようParametersConnectionなどを読み取るためにObjectQueryのうち、Contextに到達することができました:EFのObjectQuery <T>コンテキスト、Entity Frameworkの以前のバージョンのDbSet <T>

私は DbSet<T>オブジェクトを見てみると
var query = (ObjectQuery<T>)source; 

cmd.Connection = (SqlConnection)((EntityConnection)query.Context.Connection).StoreConnection; 
cmd.Parameters.AddRange(
    query.Parameters.Select(x => new SqlParameter(
     x.Name, x.Value ?? DBNull.Value) 
    ).ToArray() 
); 

、私はこれの任意の等価を見つけることができません。ここでの目的は、クエリを操作してその結果を取得する拡張機能を作成することです。ここで

はインスタンスです:http://philsversion.com/2011/09/07/async-entity-framework-queries

または私はDbContextクラスの拡張機能を記述し、Set方法で動作するはずですか?

ここで

編集

は、私がこれまで何をしたかです。これまでの基本的な実装ではありますが、生産の準備ができていません。これに関する提案はありますか?

public static async Task<IEnumerable<T>> QueryAsync<T>(this DbContext @this, System.Linq.Expressions.Expression<Func<T, bool>> predicate = null) 
    where T : class { 

     var query = (predicate != null) ? @this.Set<T>().Where(predicate) : @this.Set<T>(); 

     var cmd = new SqlCommand(); 

     cmd.Connection = (SqlConnection)(@this.Database.Connection); 
     cmd.CommandText = query.ToString(); 

     if (cmd.Connection.State == System.Data.ConnectionState.Closed) { 

      cmd.Connection.ConnectionString = new SqlConnectionStringBuilder(cmd.Connection.ConnectionString) { 
       AsynchronousProcessing = true 
      }.ToString(); 

      cmd.Connection.Open(); 
     } 

     cmd.Disposed += (o, e) => { 

      cmd.Clone(); 
     }; 

     var source = ((IObjectContextAdapter)@this).ObjectContext.Translate<T>(
      await cmd.ExecuteReaderAsync() 
     ); 

     return source; 
} 
+0

私はPOCOとのIQueryableインターフェイス上AsSyncようextensionmethodを大好きです。申し訳ありませんが答えを持っている、しかし、私はhttp://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1015385-support-for-asynchronous-で投票しませんでしたクエリ – rfcdejong

+0

@rfcdejong私も同様に投票しました。また、私は何かを書いた。更新された質問をご覧ください。 – tugberk

+0

それは本当にhopefullに見える;)しかし、将来的にクローズ横に異なるConnectionStatesがあるかもしれない心に留めておきます。接続、実行、フェッチ、破損など。 – rfcdejong

答えて

2

これは素晴らしい回避策ですが、あなたがすでに持っているものよりも一般的に適用できるとは思いません。

ご注意ください:
- EFクエリに応じて、 IncludeまたはNotを使用している場合、読者に返される列は、渡すT型のプロパティと一致しない可能性があります。
- あなたのモデルに継承を持っているかどうかに応じて、あなたが翻訳し合格Tは常に行ごとに実体化するために正しいことが返されないかもしれません。
- ExecuteReaderAsyncから返されたタスクが完了した後も、各行を取得する必要があります。これは、クエリの実行計画とサーバーで取得する待ち時間によって、潜在的にブロック操作になります。

非同期のサポートは5.0でEFに来ていないが、我々は、我々はすべての必要なビルディングブロックは、.NET 4.5の中に含まれており、機能は私たちの優先順位リストではかなり高いです持っていることを確認するために他のチームと働きました。私はあなたにvote for it in our UserVoice siteをお勧めします。

+0

ヘッドアップありがとう。私はすでに投票しました。そうしても、この回避策は個人的な使用以上のものではないと私は考えています。私はまた、私はこれをprodで使うと確信していません。私は本当にこれをできるだけ早く利用できるようにすべきだと思います。 C#5.0での非同期サポートはすべて必須です。たぶん、CTPのような別のエクステンション・ナゲット・パッケージで、あなたが移行機能と同じように。それはうまくいくのだろうか? – tugberk

+0

私は非同期が重要であることに同意します(言語サポートは素晴らしいです!)。別のパッケージでEF用のasyncをリリースすることはできませんが、それはコアのかなり深い変更を伴います。 – divega

+0

私は今参照してください。少なくとも、あなたはこの必要性を認識しており、情報に感謝しています。私はそれがすぐにそこにあることを願っています。 – tugberk

関連する問題