Czołem
Mam taką kwestię do rozwiązania...
Chcę skorzystać z generycznej metody i rozszerzenia do auto mapera ProjectTo.
Mianowicie chciałbym zrobić coś takiego, że type w ostrych nawiasach ustalam sobie wcześniej i przypisuję np w klasie TypesOfOrder i później w zależności od warunków przekazuję to jako np Type, a nie nazwa konkretnej klasy do metody generycznej, która wywołuje ProjectTo.
Poniższy kod oczywiście się nie skompiluje, ale przedstawia idee, którą chciałbym zaimplementować.
Możecie wskazać jak prawidłowo rozwiązać taki problem ?
public class TypesOfOrder
{
public Type OrderA { get; set; }
public Type OrderB { get; set; }
public Type OrderC { get; set; }
}
public async Task<TType> GetDetailsBasedOnOrderAsync<TType>(Expression<Func<Order, bool>> expression, object projectionParameters = null) where TType : Type
{
var queryable = _chancellorDbContext.Order
.AsNoTracking()
.Where(expression)
.AsSingleQuery();
return projectionParameters is null
? await queryable
.ProjectTo<TType>(_mapper.ConfigurationProvider)
.SingleOrDefaultAsync()
: await queryable
.ProjectTo<TType>(_mapper.ConfigurationProvider, projectionParameters)
.SingleOrDefaultAsync();
}
public async Task<object> GetOrderAsync(Guid orderId, Guid orderTypeId, bool forModuleA, bool forModuleB, bool forPdf)
{
var types = new TypesOfOrder();
if (forModuleA)
types = new TypesOfOrder()
{
OrderA = typeof(OrderAModuleADto),
OrderB = typeof(OrderBModuleADto),
OrderC = typeof(OrderCModuleADto)
}
if (forModuleB)
types = new TypesOfOrder()
{
OrderA = typeof(OrderAModuleBDto),
OrderB = typeof(OrderBModuleBDto),
OrderC = typeof(OrderCModuleBDto)
}
if (forPdf)
types = new TypesOfOrder()
{
OrderA = typeof(OrderAPdfDto),
OrderB = typeof(OrderBPdfDto),
OrderC = typeof(OrderCPdfDto)
}
if (orderTypeId == OrderAGuid)
return GetDetailsBasedOnOrderAsync<types.OrderA>(expression);
if (orderTypeId == OrderBGuid)
return GetDetailsBasedOnOrderAsync<types.OrderB>(expression);
if (orderTypeId == OrderCGuid)
return GetDetailsBasedOnOrderAsync<types.OrderC>(expression);
return null;
}