5

新しい async await 機能を、エンティティ モデルにインポートされたストアド プロシージャ/関数のインポートに適用したいのですが、EF6 アルファではまだできていません。

EF6 alpha2 (または 20211 のナイトリー ビルド) で、複合型のコレクションを返すエンティティ関数インポート (SQL ストアド プロシージャを呼び出す) で新しい非同期メソッドを呼び出すことはまだ可能ですか? 例えば

private async Task<IList<Company>> getInfo (string id)
{
    using (CustomEntity context = new CustomEntity())
    {
        var query = await context.customStoredProcedure(id).ToListAsync();
        // ".ToListAsync()" method not available on above line

        // OR ALTERNATIVELY
        var query = await (from c in context.customStoredProcedure(id)
                           select new Company
                           {
                              Ident = c.id,
                              Name = c.name,
                              Country = c.country,
                              Sector = c.sector, 
                              etc. etc....
                           }).ToListAsync();
        // ".ToListAsync()" method or any "...Async" methods also not available this way

        return query;
    }
}

「ToListAsync」、または新しい非同期変更メソッドのいずれも、上記のエンティティ ストアド プロシージャ/関数のインポートでは使用できないようです。標準の「ToList」または「AsNumerable」などのメソッドのみが利用可能です。

私はこれ(http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6)に従って、コードがEF5ではなく新しいEF6 dllを参照していることを確認し、さまざまなものを使用して更新しましたステートメント。上記を除いて、すべてが正しくビルドされます。(.NET フレームワーク 4.5)

非同期メソッドを確認できるのは、DB からストアド プロシージャをインポートするだけでなく、テーブルもインポートする場合だけです。次に、上記のようにエンティティ コンテキスト (context.SomeTable) を介してそのテーブルを参照すると、いくつかの非同期メソッドが表示されます。インテリセンスに登場。

データを JSON として返す前に、複数のストアド プロシージャで新しい async await 機能を使い始めたいと思っていますが、これまでのところ機能させることができませんでした。

私は何か間違ったことをしていますか?エンティティのストアド プロシージャ/関数のインポートでは非同期機能を使用できませんか? アドバイスありがとうございます。

4

2 に答える 2

3

これは決して最善の解決策ではありません。拡張メソッドを追加して、ストアド プロシージャで await を呼び出せるようにしました。EF6.1+ の新しいリリースでは、これが正式に実装されるはずです。それまでは、ダミーの拡張メソッドが機能します。

static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source)
{
    var list = new List<T>();
    await Task.Run(() => list.AddRange(source.ToList()));
    return list;
}

ObjectResult<T>EF のバージョン 6 を反映すると、実際に実装されていることがわかりますIDbAsyncEnumerable<T>, IDbAsyncEnumerable。メソッドはToListAsync<T>(this IDbAsyncEnumerable<T> source)、LINQ クエリと同じように接続できる必要があります。

編集 ObjectResult が空の場合は null が返されます。if (source == null) return new List<T>();null の代わりに空のリストを返したい場合は、追加できます。

于 2014-03-17T04:25:31.867 に答える
1

これは古いスレッドですが、共有する必要があると感じました。APM を使用してから、同期呼び出しをタスクにラップする必要があります。

例:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

次に、タスクで同期メソッドをラップします。

// wraps the method in a task and returns the task.
public Task<MyResult> MySPAsync()
{
    MySPDelegate caller = new MySPDelegate(MySP);
    return Task.Factory.FromAsync(caller.BeginInvoke, caller.EndInvoke, null);
}

実行する場合は、非同期メソッドを呼び出します。

var MyResult = await MySPAsync();

メソッドでは最大 3 つのパラメータを使用できます。ベスト プラクティスは、3 つ以上のパラメーターを使用する場合です。クラスに合格する必要があります。

于 2015-11-05T21:02:03.153 に答える