/// <summary> /// Выполнить запрос/процедуру асинхронно. /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="query">Запрос</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns></returns> internal static async Task <TEntity[]> ExecSqlAsync <TEntity>(string query, CancellationToken cancellationToken) where TEntity : class { using (IDBSource source = new MKKContext()) { return(await((DbContext)source).Set <TEntity>().FromSqlRaw(query).ToArrayAsync(cancellationToken)); } }
/// <summary> /// Найти асинхронно клиента по ID из 1С. /// </summary> /// <param name="code1C">Код клиента</param> /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns>Запись в БД</returns> internal static async Task <ClientDB> FindClientAndLogErrorAsync <TLoggedClass>(string code1C, LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken) where TLoggedClass : class { using (IDBSource source = new MKKContext()) { return(await ClientDBQuery(source, code1C).SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Найти асинхронно договор по коду 1С. /// </summary> /// <param name="account1CCode">Номер договора</param> /// <param name="cancellationToken">Токен отмены</param> /// <param name="includes">Инклуды</param> /// <returns>Запись в БД</returns> internal static async Task <Account1C> FindAccountAsync(string account1CCode, CancellationToken cancellationToken, params Expression <Func <Account1C, object> >[] includes) { using (IDBSource source = new MKKContext()) { return(await AccountDBQuery(source, account1CCode, includes).SingleOrDefaultAsync(cancellationToken)); } }
/// <summary> /// Выполнить запрос/процедуру асинхронно и при необходимости логировать ошибки. /// </summary> /// <typeparam name="TEntity">Результат выполнения запроса</typeparam> /// <typeparam name="TLoggedClass">Класс логируемого объекта</typeparam> /// <param name="query">Запрос</param> /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns></returns> internal static async Task <TEntity[]> ExecSqlAndLogErrorAsync <TEntity, TLoggedClass>(string query, LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken) where TEntity : class where TLoggedClass : class { using (IDBSource source = new MKKContext()) { return(await((MKKContext)source).Set <TEntity>().FromSqlRaw(query). ToArrayAndLogErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Найти асинхронно договор по коду 1С. /// </summary> /// <typeparam name="TLoggedClass">Тип логируемого объекта</typeparam> /// <param name="account1CCode">Номер договора 1С</param> /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param> /// <param name="cancellationToken">Токен отмены</param> /// <param name="includes">Инклуды</param> /// <returns></returns> internal static async Task <Account1C> FindAccountAndLogErrorAsync <TLoggedClass>(string account1CCode, LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken, params Expression <Func <Account1C, object> >[] includes) where TLoggedClass : class { using (IDBSource source = new MKKContext()) { return(await AccountDBQuery(source, account1CCode, includes). SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Получить описание файла по ID асинхронно. /// </summary> /// <param name="idFileDescription"></param> /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns></returns> internal static async Task <FileDescriptionDB> FindFileDescriptionDBAndLogErrorAsync <TLoggedClass>(int idFileDescription, LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken) where TLoggedClass : class { using (IDBSource source = new MKKContext()) { return(await source.FileDescriptionDBs. AsNoTracking(). Where(i => i.ID.Equals(idFileDescription)). SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Найти асинхронно клиента по ID из 1С. /// </summary> /// <param name="code1C">Код клиента</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns>Запись в БД</returns> internal static async Task <ClientDB> FindClientAndLogErrorAsync <TLoggedClass>(string code1C, CancellationToken cancellationToken) where TLoggedClass : class { using (IDBSource source = new MKKContext()) { ILogger <TLoggedClass> logger = LoggerFactory.CreateLogger <TLoggedClass>(); LoggedMessage <TLoggedClass> loggedMessage = new LoggedMessage <TLoggedClass>(logger, "Ошибка поиска клиента в БД./* Код клиента {client1CCode}.*/", code1C); return(await ClientDBQuery(source, code1C).SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Получить описание файла по ID асинхронно. /// </summary> /// <param name="idFileDescription"></param> /// <param name="cancellationToken">Токен отмены</param> /// <returns></returns> internal static async Task <FileDescriptionDB> FindFileDescriptionDBAndLogErrorAsync <TLoggedClass>(int idFileDescription, CancellationToken cancellationToken) where TLoggedClass : class { ILogger <TLoggedClass> logger = LoggerFactory.CreateLogger <TLoggedClass>(); LoggedMessage <TLoggedClass> loggedMessage = new LoggedMessage <TLoggedClass>(logger, "Ошибка поиска описания файла в БД./* Код описания {idFileDescription}.*/", idFileDescription); using (IDBSource source = new MKKContext()) { return(await source.FileDescriptionDBs. AsNoTracking(). Where(i => i.ID.Equals(idFileDescription)). SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Найти объект по ID. /// </summary> /// <param name="id">ID объекта</param> /// <param name="includes">Инклуды</param> /// <returns>Запись в БД</returns> private static TEntity FindDBRecordByID <TEntity>(int id, params Expression <Func <TEntity, object> >[] includes) where TEntity : class, IDBTableID { using (IDBSource source = new MKKContext()) { IQueryable <TEntity> query = ((DbContext)source).Set <TEntity>(). AsNoTracking(). Where(i => i.ID.Equals(id)); foreach (var include in includes) { query = query.Include(include); } return(query.SingleOrDefault()); } }
/// <summary> /// Найти объект по ID. /// </summary> /// <param name="id">ID объекта</param> /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param> /// <param name="cancellationToken">Токен отмены</param> /// <param name="includes">Инклуды</param> /// <returns>Запись в БД</returns> internal static async Task <TEntity> FindDBRecordByIDdAndLogErrorAsync <TEntity, TLoggedClass>(int id, LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken, params Expression <Func <TEntity, object> >[] includes) where TEntity : class, IDBTableID where TLoggedClass : class { using (IDBSource source = new MKKContext()) { IQueryable <TEntity> query = ((DbContext)source).Set <TEntity>(). AsNoTracking(). Where(i => i.ID.Equals(id)); foreach (var include in includes) { query = query.Include(include); } return(await query.SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken)); } }
/// <summary> /// Найти запись в БД по имени асинхронно. Если записи нет, то создать новую с Name = параметру name. /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="name">Имя записи</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns>Запись с искомым ID</returns> internal static async Task <TEntity> FindRequiredDBRecordByNameAsync <TEntity>(string name, CancellationToken cancellationToken) where TEntity : class, IDBTableName, new() { using (IDBSource dbSource = new MKKContext()) { TEntity dbRecord = await GetSingleRecordByNameQuery <TEntity>(dbSource, name). SingleOrDefaultAsync(cancellationToken); if (dbRecord != default) { return(dbRecord); } TEntity newRecord = new TEntity() { Name = name }; await((DbContext)dbSource).Set <TEntity>().AddAsync(newRecord, cancellationToken); await((DbContext)dbSource).SaveChangesAsync(cancellationToken); return(newRecord); } }
/// <summary> /// Найти запись в БД по имени асинхронно. Если записи нет, то создать новую с Name = параметру name, Code1C = code1C. /// </summary> /// <typeparam name="TEntity">Таблица</typeparam> /// <typeparam name="TLoggedClass">Класс логируемого объекта</typeparam> /// <param name="name">Имя записи</param> /// <param name="code1C">Код 1С</param> /// <param name="loggedMessage">Описание места и состоянии объекта вызвавшего исключение</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns>Запись с искомым ID</returns> internal static async Task <TEntity> FindRequiredDBRecordByNameAndLogErrorAsync <TEntity, TLoggedClass>(string name, string code1C, LoggedMessage <TLoggedClass> loggedMessage, CancellationToken cancellationToken) where TEntity : class, IDBTableIDNameW1CCode, new() where TLoggedClass : class { using (IDBSource dbSource = new MKKContext()) { TEntity dbRecord = await GetSingleRecordByNameQuery <TEntity>(dbSource, name). SingleOrDefaultAndErrorAsync(loggedMessage, cancellationToken); if (dbRecord == default) { TEntity newRecord = new TEntity() { Name = name, Code1C = code1C }; await((DbContext)dbSource).Set <TEntity>().AddAsync(newRecord, cancellationToken); await dbSource.SaveChangesAndLogErrorAsync(loggedMessage, cancellationToken); return(newRecord); } return(dbRecord); } }
/// <summary> /// Найти договор по коду 1С. /// </summary> /// <param name="account1CCode">Код клиента</param> /// <param name="includes">Инклуды</param> /// <returns>Запись в БД</returns> internal static Account1C FindAccount(string account1CCode, params Expression <Func <Account1C, object> >[] includes) { using (IDBSource source = new MKKContext()) { return(AccountDBQuery(source, account1CCode, includes).SingleOrDefault()); } }
/// <summary> /// Найти клиента по ID из 1С. /// </summary> /// <param name="code1C">Код клиента</param> /// <returns>Запись в БД</returns> private static ClientDB FindClient(string code1C) { using (IDBSource source = new MKKContext()) { return(ClientDBQuery(source, code1C).SingleOrDefault()); } }