C# приложение для доступа к данным с PostgreSQL и SQL Сервера - PullRequest
0 голосов
/ 07 мая 2020

Каков наилучший способ go доступа к данным из SQL сервера и PostgreSQL баз данных в одном ASP. NET веб-приложении? У меня есть сетка, в которой я хотел бы иметь столбцы данных из обеих баз данных. Есть предложения?

Я попытался создать драйвер ODB C на сервере SQL со связанным сервером с PostgreSQL, а затем создать представление, выбирающее из обеих баз данных. У меня много ошибок конвертации, которые я не знаю, как исправить, и проблемы с производительностью.

1 Ответ

0 голосов
/ 07 мая 2020

Вам необходимо создать два контекста (Unit of Work), один для сервера Sql, а другой для PostgreSql.

После этого вам нужно создать один репозиторий для получения данных с сервера sql используя Unit of Work для Sql Server и то же самое для PostgreSql.

Создайте службу для вызова обоих репозиториев

, затем вызовите оба репозитория и получите данные, которые вам нужны для создания класс, который будет заполнен обоими возвратами из репозиториев

что-то вроде этого

SqlServer Repository

public class SqlRepository: ISqlRepository
{
    private readonly ISqlUoW _uow;

    public SqlRepository(ISqlUoW uow)
    {
        _uow = uow;
    }

    public async Task<EntityA> GetDataAsync()
    {
        return await _uow.Connection.QueryAsync<EntityA>("select field1,field2 FROM EntityA");
    }
}

PostgreSql Repository

public class PGRepository: IPGRepository
{
    private readonly IUoWPG  _uow;

    public PGRepository(IUoWPG uow)
    {
        _uow = uow;
    }

    public async Task<Entityb> GetDataAsync()
    {
        return await _uow.Connection.QueryAsync<EntityB>("select field1,field3 FROM EntityB");
    }
}

класс данных сетки

public class GridData
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

Сервис

public class GridService : IGridService
{
    private readonly ISqlRepository _sqlRepository;
    private readonly IPGRepository _pgRepository;

    public GridService(ISqlRepository sqlRepository, IPGRepository pgRepository)
    {
        _sqlRepository = sqlRepository;
        _pgRepository = pgRepository;
    }

    public async Task<IList<GridData>> GetGridData()
    {
        var sqlData = await _sqlRepository.GetDataAsync();
        var pgData = await _pgRepository.GetDataAsync();

        var gridData = from sql in sqlData
                       join pg in pgData on sql.Field1 equals pg.Field1
                       select new GridData()
                       {
                           Field1 = sql.Field1,
                           Field2 = sql.Field2,
                           Field3 = pg.Field3
                       };

        return gridData;
    }
}

в этом сценарии общий ключ между таблицами является свойством Поле1

надеюсь, это поможет

...