我有一些 EF 正在创建的非常大的查询,导致响应时间慢和 CPU 使用率高,所以我认为作为一种优化方法,我会尝试实现 MARS 和异步并行查询,以并行和操作拉回多个更简单的结果集在记忆中。
即我想这样做:
public async Task<IEnumerable<TResult>> GetResult<TResult>()
{
using(var context = new Context())
{
return await context.Set<TResult1>().ToListAsync().ConfigureAwait(false);
}
}
IEnumerable<TResult1> result1;
IEnumerable<TResult2> result2;
var result1Task = GetResult<TResult1>();
var result2Task = GetResult<TResult2>();
await Task.WhenAll(result1Task, result2Task).ConfigureAwait(false);
var result1 = result1Task.Result;
var result2 = result2Task.Result;
但不确定这是否利用了连接池,因为它DBContext
为每个任务创建了一个新的。
我找到了这篇文章,但它没有使用实体框架。
我发现这个是使用 Core 的,这不是推荐的策略。
而这个使用 .NET 框架的实体框架,但使用存储过程作为示例,但我只想并行发出 3 个读取查询,而不是调用 SP。
理想情况下,寻找一种方法来实现多个结果集,使用 linq 生成 SQL(与使用字符串相比select Id, VendorName From Vendors....
)并将结果自动映射到类,而无需使用字符串(vendorID = (int)vendorReader["BusinessEntityID"];
)。
这是可能的还是白日梦?