Entity Framework Core IEnumerable асинхронный - PullRequest
0 голосов
/ 14 июля 2020

Я реализовал в своем проекте шаблон репозитория и имею CoinRepository, и я хочу добавить новый метод (GetValues), который извлекает только один столбец (значения) на основе условия из таблицы Coin, которая имеет несколько столбцы.

Вот класс CoinRepositopry и метод.

public class CoinRepository : Repository<Coin>, ICoinRepository
{
    public CoinRepository(MyContext context) : base(context) { }

    public IEnumerable<decimal> GetValuesAsync(int gameId, int gameTableId, string partnerCurrencyId)
    {
        return GetAllAsync().Result
            .Where(c => c.GameId == gameId && c.CurrencyId == partnerCurrencyId)
            .Select(c => c.Value);
    }
}

Метод GetAllAsync - это метод в интерфейсе IRepository, который возвращает Task <IEnumerable<Entity>>.

public async Task<IEnumerable<T>> GetAllAsync(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null, string includeProperties = null)
{
        IQueryable<T> query = dbSet;

        if (filter != null)
            query = query.Where(filter);

        if (includeProperties != null)
            foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
                query = query.Include(includeProperty);

        if (orderBy != null)
            return await orderBy(query).ToListAsync();

        return await query.ToListAsync();
}

Мои вопросы:

  1. Следует ли использовать метод GetValuesAsync и async?

  2. Есть ли метод GetAllAsync выполняет запрос в базе данных и извлекает все записи, затем применяет условия в коде - или он выполняет запрос в базе данных следующим образом: SELECT c.value FROM COIN c WHERE <condition>?

  3. Если у моего кода есть проблемы и он недостаточно быстр, как я могу его изменить и рефакторинг наиболее оптимальным образом?

Спасибо

1 Ответ

3 голосов
/ 14 июля 2020

Следует ли мне использовать метод GetValuesAsync и async?

Да, определенно. Asyn c распространяется вверх по стеку вызовов. Обращаясь к Result, вы блокируете поток и побеждаете цель asyn c.

Выполняет ли метод GetAllAsync запрос в базе данных, извлекает все записи и затем применяет условие в коде или выполните запрос в базе данных следующим образом SELECT c.value FROM COIN c WHERE?

Вы не указали выражение для Where, поэтому оно будет извлекать все строки из базы данных и фильтровать в -memory.

Если в моем коде есть проблемы, и он недостаточно быстр, как я могу изменить его и реорганизовать наиболее оптимальным образом?

public class CoinRepository : Repository<Coin>, ICoinRepository
{
    public CoinRepository(MyContext context) : base(context) { }

    public async Task<IEnumerable<decimal>> GetValuesAsync(int gameId, int gameTableId, string partnerCurrencyId)
    {
        var coins = await GetAllAsync(c => c.GameId == gameId && c.CurrencyId == partnerCurrencyId,
            includeProperties: nameof(Coin.Value));
        return coins.Select(c => c.Value);
    }
}

Таким образом, вы передаете выражение в GetAllAsync, которое можно использовать для создания предложения SQL where, и указываете только столбец Value для извлечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...