5

我想将新的异步等待功能应用于在我的实体模型中导入的存储过程/函数导入,但目前还无法使用 EF6 alpha。

是否有可能在 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)确保代码引用新的 EF6 dll 而不是 EF5,并更新了各种使用陈述。除了上面,一切都正确构建。(.NET 框架 4.5)

我唯一能看到异步方法的情况是,我不仅从数据库中导入存储过程,还导入了一个表——然后当通过上面的实体上下文 (context.SomeTable) 引用该表时,一些异步方法出现在智能感知中。

在以 JSON 格式返回数据之前,我真的很想在多个存储过程上开始使用新的异步等待功能,但到目前为止还不能让它工作。

难道我做错了什么?实体存储过程/函数导入是否无法实现异步功能?谢谢你的建议。

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;
}

如果您反映 EF 的第 6 版,您将看到它ObjectResult<T>实际上实现了IDbAsyncEnumerable<T>, IDbAsyncEnumerable. 并且 for 的方法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);
}

要执行时调用 async 方法:

var MyResult = await MySPAsync();

您最多可以在方法中使用三 (3) 个参数。最佳做法是使用三个以上的参数;你应该通过一堂课。

于 2015-11-05T21:02:03.153 回答