このアプローチasync/await
と比較して、新しい C# 5 キーワードで L2S を使用するベスト プラクティスは何ですか? ウェブ上では見つかりませんでした。
2 に答える
EF 5 には async/await のサポートはありませんが、オープン ソース バージョンでは積極的に可能性を探っています。編集: EF での非同期サポートは、http://msdn.microsoft.com/en-us/data/jj819165.aspx で文書化されています。結果がハイドレートされているため (RX で見られるように)、結果をストリーミングしませんが、データベース呼び出しを非同期にします。
LINQ to SQL に関しては、Task.Factory.Start 操作でリクエストをラップする以外に、タスク ベースの非同期 (async/await に必要) が Microsoft によって Linq to SQL 用に実装されることを願っています。
どうしても必要な場合は、 IQToolkitを使用して拡張し、独自の非同期サポートを追加することができます。また、Mono には LINQ to SQL が実装されており、非同期サポートで拡張できる可能性があります。
Scott Hanselman の興味深い投稿があり、既存の Linq to SQL クエリの上に非同期 API を作成する方法を示しています。このアイデアをいじる時間はあまりありませんが、同じ手法を IQueryable または IEnumerable 型の任意のオブジェクトに拡張できる、より一般的な拡張メソッドを作成できると思います。
これは、参照として使用する彼の投稿からの直接のコードです。
SqlCommand _beginFindCmd = null;
public IAsyncResult BeginFind(int id, AsyncCallback callback, Object asyncState)
{
var query = from w in _db.Widgets
where w.Id == id
select w;
_beginFindCmd = _db.GetCommand(query) as SqlCommand;
_db.Connection.Open();
return _beginFindCmd.BeginExecuteReader(callback, asyncState, System.Data.CommandBehavior.CloseConnection);
}
public Widget EndFind(IAsyncResult result)
{
var rdr = _beginFindCmd.EndExecuteReader(result);
var widget = (from w in _db.Translate<Widget>(rdr)
select w).SingleOrDefault();
rdr.Close();
return widget;
}
少しの作業で、この TPL を作成し、同様に単一の非同期メソッドとしてよりクリーンにすることができます。これを行う機会があれば、私が思いついたものを投稿します。