Можно ли передать select как выражение для создания проекции DbSet? - PullRequest
0 голосов
/ 03 июля 2019

Я хотел бы запросить таблицу базы данных.Интересно, могу ли я использовать проекцию, передавая выражение в DbSet.

Вот мой запрос:

 var gameBankResultVM = await (context.GameBanks
                .Where(l => l.referenceId == confirm.referenceId)
                .Select(g => new GameBankConfirmResponseVM()
                {
                    referenceId = g.referenceId,
                    paymentId = null,
                    productCode = g.productCode,
                    quantity = g.quantity,
                    deliveredQuantity = g.quantity,
                    currency = g.currency,
                    version = g.version,
                    signature = g.signature,
                    ApplicationCode = g.ApplicationCode,
                    productDescription = g.productDescription,
                    unitPrice = g.unitPrice,
                    totalPrice = g.totalPrice,
                    totalPayablePrice = g.totalPrice,
                    coupons = g.coupons.Select(c => new GameCouponBankVM()
                    {
                        Pin = c.Pin,
                        Serial = c.Serial,
                        expiryDate = c.expiryDate
                    }).ToList()
                })).ToListAsync();

Вот что я хочу;

public virtual async Task<List<TEntity>> GetGamesProjectionAsync(
            Expression<Func<TEntity, bool>> where, Expression<Func<TEntity, bool>> select)
        {
            return await dbSet.Where(where).Select(select).ToListAsync();
        }

Ивызов этого метода на основе моей проекции запроса:

//Query GameBank database
                var gameBankResult =
                    await _unitOfWork.GameBankRepository.GetGamesAsync(g =>
                        g.productCode == requestDto.productCode && g.referenceId == null, t => ...);

1 Ответ

0 голосов
/ 04 июля 2019

Я просто опускаю часть выбора (проекции) и реализую метод для общего хранилища следующим образом:

public virtual async Task<List<TEntity>> GetGamesAsync(
        Expression<Func<TEntity, bool>> where)
    {
        return await dbSet.Where(where).ToListAsync();
    }

Я называю это на уровне бизнес-сервисов:

//Query GameBank database
            var gameBankResult =
                await _unitOfWork.GameBankRepository.GetGamesAsync(g =>
                    g.productCode == requestDto.productCode && g.referenceId == null);

И вот решение моей проблемы, я использовал Automapper, чтобы сделать преобразование.

    var config = new MapperConfiguration(cfg =>
                {

                    cfg.CreateMap<GameBank, GameConfirmResponse>();
                    cfg.CreateMap<GameBankPin, Coupon>();
                });
                var iMapper = config.CreateMapper();
var gameBankConfirmResponse = iMapper.Map<IList<GameBank>, IList<GameConfirmResponse>>(gameBankConfirmResult);

Теперь все, что мне нужно, - это использовать Unity, чтобы привести в порядок все сопоставления :) Надеюсь, кто-нибудь мне поможет.

Определенно мне нужно что-то вроде ниже:

группировка по универсальному методу в репозитории EF C #

...