我有多个具有相同架构/上下文的数据库,我想查询所有数据库。 我想在每个数据库上执行相同的查询。 我无法在 SQL 中使用链接服务器,因为数据库是动态创建/删除的。 有什么方法可以为上下文创建一些扩展方法,以便查询将在所有这些方法上执行? (顺序或并行)
我已经为一张表完成了此操作,但我想要一些可以适用于所有表的东西,因此我不必为每个表编写相同的代码。
ConcurrentBag<FindConstructionSearchResult> results = new();
Parallel.ForEach(connStrings, new() { MaxDegreeOfParallelism = 16 }, dbConnectionInfo =>
{
DB_DataContext dctx = DbHelper.Get_DataDBContext(dbConnectionInfo.DbName, dbInstance);
List<FindConstructionSearchResult> sstavby = dctx.SStavby.Where(x => x.Nazev.Contains(request.ConstructionName) || x.Znacka.Contains(request.ConstructionName)).Select(x => new FindConstructionSearchResult()
{
ConstructionMark = x.Znacka,
ConstructionName = x.Nazev,
Database = dbConnectionInfo.DbName
}).ToList();
foreach (var item in sstavby)
{
results.Add(item);
}
});
这相当快,但我不认为它很优雅。
您已经完成了基本的实现,只需将其包装在一个简洁的方法中即可。 EG
public class ParallelEfQuery
{
public static List<T> ExecuteQueryParallel<T>(IEnumerable<DbContext> dbContexts, Func<DbContext,IQueryable<T>> queryFactory, int maxDegreeOfParallelism = 8)
{
var results = new System.Collections.Concurrent.ConcurrentBag<T>();
Parallel.ForEach(dbContexts, new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism }, dbContext =>
{
var query = queryFactory(dbContext);
foreach (var item in query)
{
results.Add(item);
}
});
return results.ToList();
}
}