У меня есть метод получить в Web API:AutoMapper ошибка проекции
public async Task<IHttpActionResult> Get()
{
var categories = await _context.Categories.Include(x => x.SubCategories)
.Where(c => c.IsActive)
.ToListAsync();
var outPut = AutoMapper.Mapper.Map<List<CategoryDto>>(categories);
return Ok(outPut);
}
Этот метод работает, как ожидалось. Но я не хочу извлекать все записи из базы данных, а затем сопоставлять их с DTO и возвращать результат. Я хочу использовать AutoMapper.QueryableExtensions
и выбрать только обязательное поле.
var categories = await _context.Categories.Include(x => x.SubCategories)
.Where(c => c.IsActive)
.ProjectTo<List<CategoryDto>>()
.ToListAsync();
В конфигурации отображения я определил отображение как:
public static void Config()
{
AutoMapper.Mapper.Initialize(config =>
{
config.CreateMap<SubCategory, SubCategoryDto>();
config.CreateMap<Category, CategoryDto>().ForMember(
des=>des.SubCategoriesCount,
opt=>opt.MapFrom(src=>src.SubCategories.Count));
});
}
Во время работы я получаю следующее исключение
"exceptionMessage": «Отсутствует карта от CategoriesAndBrandsServices.Models.Category к системе .Collections.Generic.List
1[CategoriesAndBrandsServices.Dtos.CategoryDto]. Create using Mapper.CreateMap<Category, List
1>. ", " exceptionType ":" System.InvalidOperationException ", " stackTrace ":" на AutoMa pper.QueryableExtensions.ExpressionBuilder.CreateMapExpression (запрос ExpressionRequest, экземпляр экземпляраParameter, IDictionary2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary
2 typePairCount) \ r \ n в AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression (запрос ExpressionRequest) \ r \ n в AutoMapper.LockingConcurrentDictionary2.<>c__DisplayClass2_1.<.ctor>b__1()\r\n at System.Lazy
1.CreateValue() \ r \ n в System.Lazy1.LazyInitValue()\r\n at System.Lazy
1.get_Value() \ r \ n в AutoMapper.LockingConcurrentDictionary2.GetOrAdd(TKey key)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(Type sourceType, Type destinationType, IDictionary
2 параметра, MemberInfo [] membersToExpand) \ r \ n в AutoMapper.QueryableExtensions.ProjectionExpression.To [TResult] (IDictionary2 parameters, IEnumerable
1 memberPathsToExpand) \ r \ n в AutoMapper.QueryableExtensions.ProjectionExpression.To [TResult] (параметры объекта, выражение1[] membersToExpand)\r\n at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression
1 [] membersToExpand) \ r \ n в AutoMapper.QueryableExtensions.Extensions.ProjectTo [TDestination] (IQueryable source, Expression1[] membersToExpand)\r\n at CategoriesAndBrandsServices.Controllers.CategoriesController.<Get>d__0.MoveNext() in c:\\OnlineShoppingWebsite\\Services\\CategoriesAndBrandsServices\\CategoriesAndBrandsServices\\Controllers\\CategoriesController.cs:line 24\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter
1. GetResult() \ r \ n в Sy stem.Threading.Tasks.TaskHelpersExtensions.d__31.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() \ r \ n в System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() \ r \ n --- Конец трассировки стека из предыдущего места, где исключение было выбрано --- \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ r \ n в System.Runtime .CompilerServices.TaskAwaiter1.GetResult()\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter
1.GetResult() \ г \ п на System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()»
Это не сработает. Я уже пробовал. И у проекта есть от одного до многих отношений. Если вы проверите конфигурацию отображения для категорий, вы можете легко понять, что у нее есть отношения друг к другу. –
Попробуйте, пожалуйста, сделать это еще раз и опубликовать исключение. –
Я не вижу проблем с одним для многих, сейчас исключение говорит вам, что вы пытаетесь преобразовать категорию в список, поэтому, пожалуйста, попробуйте сделать то, что я написал, и опубликовать мне другое исключение, которое вы получаете. –