LINQ JOIN in. NET Core 3.1 - PullRequest
       52

LINQ JOIN in. NET Core 3.1

0 голосов
/ 30 апреля 2020

Я создал join с помощью LINQ, и мне интересно, есть ли лучший способ выполнить sh.

public async Task<IEnumerable<Prices>> GetTicketsPrices(db501Context _context,string Provider)
{
    int ProviderKey = 0;
    switch (Provider)
    {
        case "A":
           ProviderKey = 1;
            break;

        case "B":
            ProviderKey = 2;
            break;

        default:
            ProviderKey = 0;
            break;
    }


    var voucherPrices = await _context.VoucherPrices.Select(r => r).ToListAsync();
    var Providers = await _context.VoucherProviders.Select(p => p).ToListAsync();
    var voucherTypes = await _context.VoucherTypes.Select(t => t).ToListAsync();
    var passengerType = await _context.VouchersPassengerTypes.Select(pt => pt).ToListAsync();

    var newQueyObjectResult = from price in voucherPrices
                              join provider in Providers on price.Provider equals provider.Id
                              join type in voucherTypes on price.Type equals type.Id
                              join passenger in passengerType on price.PassengerType equals passenger.Id
                              where provider.Id == ProviderKey
                              select new Prices { Provider = provider.Name, PassengerType = passenger.Description,Type = type.Description,Price = price.Price};

    return newQueyObjectResult;

}

В настоящее время я получаю данные из context четыре раза. Результат списка каждой модели присваивается отдельной переменной.

Это лучший способ сделать это? Могу ли я использовать контекст только один раз для извлечения всех данных, кроме использования хранимой процедуры?

1 Ответ

3 голосов
/ 30 апреля 2020

Вместо этого вы можете попробовать что-то вроде этого:

var prices = await (
    from price in _context.VoucherPrices
    where provider.Id == ProviderKey
    select new Prices
    {
        Provider = price.Provider.Name,
        PassengerType = price.PassengerType.Description,
        Type = price.Type.Description,
        Price = price.Price
    }
).ToListAsync();

Это просто использование свойств навигации вместо ручных соединений. Вам просто нужно быть осторожным, чтобы записи были связаны с внешними ключами (или вместо этого выполняйте null проверки), например:

Provider = price.Provider != default ? price.Provider.Name : default,
PassengerType = price.PassengerType != default ? price.PassengerType.Description : default,
Type = price.Type != default ? price.Type.Description : default
...