EF6 alpha異步等待實體存儲過程/函數導入?

async-await c#-5.0 entity-framework entity-framework-6

我想將新的異步等待功能應用於我的實體模型中導入的存儲過程/函數導入,但目前還無法使用EF6 alpha。

在EF6 alpha2(或20211的每晚構建)中,是否可以在實體函數導入(調用SQL存儲過程)上調用任何返回複雜類型集合的新Async方法?例如

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 )以確保代碼引用新的EF6 dll而不是EF5,以及更新各種使用聲明。除此之外,一切都正確建立。 (.NET Framework 4.5)

我唯一能看到異步方法的是,如果不是只從DB導入存儲過程,我還導入一個表 - 然後在通過上面的Entity上下文引用該表時(context.SomeTable),一些異步方法出現在intellisense中。

在將數據作為JSON返回之前,我真的想在多個存儲過程中開始使用新的異步等待功能,但到目前為止還無法使它工作。

難道我做錯了什麼?實體存儲過程/函數導入是否無法實現異步功能?謝謝你的建議。

一般承認的答案

現在這絕不是最好的解決方案。我添加了一個擴展方法,以便我可以在我的存儲過程上調用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;
}

如果您反映EF的版本6,您將看到ObjectResult<T>實際上實現了IDbAsyncEnumerable<T>, IDbAsyncEnumerableToListAsync<T>(this IDbAsyncEnumerable<T> source)應該能夠像LINQ查詢一樣連接它。

編輯當ObjectResult為空時,返回null。你可以添加if (source == null) return new List<T>();如果要返回空List而不是null。


熱門答案

這是一個老線程,但我覺得我應該分享。您應該使用APM然後在同步中包裝同步調用。

例:

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

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

然後將同步方法包裝在Task中:

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

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

要執行時調用async方法:

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

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

您可以在方法中使用最多三(3)個參數。最佳做法是使用三個以上的參數;你應該上課。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因