EF6阿尔法异步等待对实体存储过程/函数导入?(EF6 alpha Async Await on a

2019-07-20 10:47发布

我想申请新的异步等待功能,在我的实体模型导入存储过程/函数导入,但尚未已经无法与EF6阿尔法。

难道还不可能在EF6α-2(或每晚构建为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多个存储过程的功能,但一直没能得到它的工作至今。

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

Answer 1:

现在,这绝不是最好的解决方案。 我添加了一个扩展方法,这样我可以打电话给我的存储过程的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 。 和用于该方法ToListAsync<T>(this IDbAsyncEnumerable<T> source)应该能够接线它一样LINQ查询。

编辑当ObjectResult是返回空空。 您可以添加if (source == null) return new List<T>(); 如果你想,而不是返回空的空列表。



Answer 2:

这是一个古老的线程,但我觉得我应该分享。 您应该使用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)参数。 最好的做法是,如果你使用三个以上的参数; 你应该通过在一个类中。



文章来源: EF6 alpha Async Await on an Entity Stored Procedure / Function Import?