gpt4 book ai didi

c# - 同时执行两个数据库调用(使用两个 DbContext)

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:23 25 4
gpt4 key购买 nike

我需要从两个不同的 DbContext 获得结果(针对 Oracle 数据库的两个不同模式)来填充页面。我想同时执行两个数据库查询(只读,无写操作)并在它们都完成后返回结果。麻烦的是,我是平行世界中的连续人物,我不知道 jack Async/Await/TPL等等……

我有一个 Controller Action看起来基本上是这样的:

public Task<IActionResult> Foo(MyViewModel vm)
{
if (!ModelState.IsValid) return Task.Run(()=> (IActionResult)View(vm));

var filter = new FilterObject(vm);
var firstTask = _firstContext.FilterItems(filter); // returns Task<IQueryable<Items>>
var secondTask = _secondContext.FilterItems(filter); // returns Task<IQueryable<Items>>

vm.Result.Clear();
vm.Results.AddRange(firstTask.Result);
vm.Results.AddRange(secondTask.Result);

return Task.Run(()=> (IActionResult)View("Index", vm));
}

我的 DbContext调用过滤器来完成它的工作:

public class FirstContext : DbContext
{
public DbQuery<Items> Items{get;set;}

public Task<IQueryable<Items>> FilterItems(FilterObject filter)
{
filter.ApplyTo(Items.AsQueryable());
}
}

...我的 FilterObject 修改了 IQueryable:

public class FilterObject
{
public Task<IQueryable<Items>> ApplyTo(IQueryable<Items> items)
{
return Task.Run(()=> items
.Where(item => item.Property1.Contains(this.Property1))
.Where(item => item.Other == this.OtherString)
// more Where clauses ad nauseum; you get the idea
}
}

我这样做是否接近正确?据我了解,对数据库的调用直到 AddRange 才会真正执行。方法,因为 Task.Result是一个 IQueryable - 所以这对我来说似乎是错误的:AddRange()方法将同步执行,而不是异步执行,对吧?我所做的只是构建两个查询,而不是执行它们。我猜我需要返回 List<Item>来自 DbContext,这将导致每个查询实际执行...但这是我需要做的唯一更改,以便这些调用同时发生,而不会相互阻塞吗?

一如既往,非常感谢任何指导。

最佳答案

放下你所有的Task从你拥有的 IQueryables 开始工作。那一层太多了。把事情简单化。你有一个查询。这将返回 IQueryable<> .然后你使用 ToListAsync异步获取结果:

public async Task<IActionResult> Foo(MyViewModel vm)
{
if (!ModelState.IsValid) return View(vm);

var filter = new FilterObject(vm);
var firstTask = _firstContext.YourQueryable.ToListAsync();
var secondTask = _secondContext.YourQueryable.ToListAsync();

var firstResult = await firstTask;
var secondResult = await secondTask;

vm.Result.Clear();
vm.Results.AddRange(firstResult);
vm.Results.AddRange(secondResult);

return View("Index", vm);
}

关于c# - 同时执行两个数据库调用(使用两个 DbContext),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com