我想将新的异步等待功能应用于我的实体模型中导入的存储过程/函数导入,但目前还无法使用EF6 alpha。
在EF6 alpha2(或20211中的每晚构建)中,是否可以在实体函数导入(调用SQL存储过程)上调用任何返回复杂类型集合的新Async方法? e.g。
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,以及更新各种using语句。除此之外,一切都正确建立。 (.NET Framework 4.5)
我唯一能看到异步方法的是,如果不是只从DB导入存储过程,我还导入一个表 - 然后在通过上面的Entity上下文引用该表时(context.SomeTable),异步方法出现在intellisense中。
我真的想在将数据作为JSON返回之前开始在多个存储过程中使用新的异步等待功能,但到目前为止还无法使其工作。
我做错了吗?实体存储过程/函数导入是否无法实现异步功能?谢谢你的建议。
答案 0 :(得分:4)
现在这绝不是最好的解决方案。我添加了一个扩展方法,以便我可以在我的存储过程上调用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为空时,返回null。如果要返回空List而不是null,可以添加if (source == null) return new List<T>();
。
答案 1 :(得分:0)
这是一个老线程,但我觉得我应该分享。您应该使用APM然后在同步中包装同步调用。
示例:
//declare the delegate
private delegate MyResult MySPDelegate();
// declare the synchronous method
private MyResult MySP()
{
// do work...
}
然后将同步方法包装在Task:
中// 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)个参数。最佳做法是使用三个以上的参数;你应该上课。