EF Core 在多个数据库上执行相同的查询

问题描述 投票:0回答:1

我有多个具有相同架构/上下文的数据库,我想查询所有数据库。 我想在每个数据库上执行相同的查询。 我无法在 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);
    }
});

这相当快,但我不认为它很优雅。

c# sql-server entity-framework
1个回答
0
投票

您已经完成了基本的实现,只需将其包装在一个简洁的方法中即可。 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();

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.