Я модернизирую рабочий конвейер linq до асинхронного и немного борюсь с синтаксисом / логикой (где таскан.рун, асинхронный / ожидающий, Толист ...).На данный момент он не скомпилируется, так как последний метод возвращает IEnumerable продуктов Task вместо IEnumerable of products
, вот вызов:
public async Task<IEnumerable<ProductDto>> GetProducts(bool isLogged)
{
return await _mapper.GetStripeProductsDto(isLogged, false);
}
одного из репозиториев:
public async Task<IEnumerable<StripeProduct>> GetAllStripeProductsAsync()
{
return (await _productService.ListAsync())
.Where(x => x.Type == "good" && x.Active == true);
}
и где я строю свой dto и борюсь с:
public async Task<IEnumerable<ProductDto>> GetStripeProductsDto(bool isLogged, bool isSubscriber)
{
var productList = (await _productRepo.GetAllStripeProductsAsync()).ToList();
return await Task.Run(async () =>
GetSkuOffers(productList)
.Concat(await GetSubsciptionOffers(productList))
.GroupBy(product => product.Name)
.Select(productGroup => new ProductDto
{
Name = productGroup.Key,
Id = productGroup.Select(product => product.Id).First(),
Description = productGroup.Select(product => product.Description).First(),
Image = productGroup.Select(product => product.Image).First(),
CurrentUserProfile = isSubscriber
? OfferTypeEnum.Pro.ToString()
: isLogged
? OfferTypeEnum.Registered.ToString()
: OfferTypeEnum.Basic.ToString(),
Prices = productGroup.Select(product => new
{
Offer = product.OfferType.ToString(),
Price = product.Price.ToString()
})
.ToDictionary(p => p.Offer, p => p.Price)
})
.ToList())
.ConfigureAwait(false);
}
private IEnumerable<Product> GetSkuOffers(IEnumerable<StripeProduct> productList)
{
return productList
.SelectMany(sku => sku.Skus.Data, (product, sku) => new Product
{
Name = product.Name,
Id = product.Id,
Image = new Uri(product.Images.First()),
Description = product.Description,
OfferType = sku.Id.Contains("Basic") ? OfferTypeEnum.Basic : OfferTypeEnum.Registered,
Price = sku.Price
});
}
private IEnumerable<Product> GetSubsciptionOffers(IEnumerable<StripeProduct> productList)
{
return
productList
.Select(async product => new Product
{
Name = product.Name,
Id = product.Id,
Image = new Uri(product.Images.First()),
Description = product.Description,
OfferType = OfferTypeEnum.Pro,
Price = (await _planRepo.GetPlanByIdAsync(product.Metadata.First().Value)).Amount.GetValueOrDefault()
});
}
РЕДАКТИРОВАТЬ: компилирование версии, ToListAsync, кажется, работает только для БД, мое хранилище делает вызовы API, поэтому яотказался от этого;Я удалил Task.Run (...) и избавился от IEnumerable продуктов Task, возможно, неприятным образом
public async Task<IEnumerable<ProductDto>> GetStripeProductsDto(bool isLogged, bool isSubscriber)
{
var productList = (await _productRepo.GetAllStripeProductsAsync()).ToList();
var skuOffers = GetSkuOffers(productList);
var subsciptionOffers = GetSubsciptionOffers(productList);
return skuOffers
.Concat(subsciptionOffers)
.GroupBy(product => product.Name)
.Select(productGroup => new ProductDto
{
Name = productGroup.Key,
Id = productGroup.Select(product => product.Id).First(),
Description = productGroup.Select(product => product.Description).First(),
Image = productGroup.Select(product => product.Image).First(),
CurrentUserProfile = isSubscriber
? OfferTypeEnum.Pro.ToString()
: isLogged
? OfferTypeEnum.Registered.ToString()
: OfferTypeEnum.Basic.ToString(),
Prices = productGroup.Select(product => new
{
Offer = product.OfferType.ToString(),
Price = product.Price.ToString()
})
.ToDictionary(p => p.Offer, p => p.Price)
})
.ToList();
}
private IEnumerable<Product> GetSkuOffers(IEnumerable<StripeProduct> productList)
{
return productList
.SelectMany(sku => sku.Skus.Data, (product, sku) => new Product
{
Name = product.Name,
Id = product.Id,
Image = new Uri(product.Images.First()),
Description = product.Description,
OfferType = sku.Id.Contains("Basic") ? OfferTypeEnum.Basic : OfferTypeEnum.Registered,
Price = sku.Price
});
}
private IEnumerable<Product> GetSubsciptionOffers(IEnumerable<StripeProduct> productList)
{
return productList
.Select(product => new Product
{
Name = product.Name,
Id = product.Id,
Image = new Uri(product.Images.First()),
Description = product.Description,
OfferType = OfferTypeEnum.Pro,
//Price = _planRepo.GetPlanById(product.Metadata.First().Value).Amount.GetValueOrDefault()
Price = GetSubscriptionPrice(product.Metadata.First().Value)
}).ToList();
}
private int GetSubscriptionPrice(string str)
{
var plan = Task.Run(() => _planRepo.GetPlanByIdAsync(str)).GetAwaiter().GetResult();
return plan.Amount.GetValueOrDefault();
}