我在網上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「:」at AutoMa在AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest請求)\ r \ n在AutoMapper.LockingConcurrentDictionary2.<>c__DisplayClass2_1.<.ctor>b__1()\r\n at System.Lazy
1.CreateValue()\ pper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest請求,表達式instanceParameter,IDictionary2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary
2 typePairCount)\ r \ r \ n at System.Lazy1.LazyInitValue()\r\n at System.Lazy
1.get_Value()\ r \ n at AutoMapper.LockingConcurrentDictionary2.GetOrAdd(TKey key)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(Type sourceType, Type destinationType, IDictionary
2 parameters,MemberInfo [] membersToExpand)\ r \ n at AutoMapper.QueryableExtensions.ProjectionExpression.To [TResult](IDictionary2 parameters, IEnumerable
1 memberPathsToExpand )\ r \ n在AutoMapper.QueryableExtensions.Extensions.ProjectTo [TDestination](IQueryable來源,表達式1[] 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)[AutoSetper.QueryableExtensions.ProjectionExpression.To [TResult](Object parameters,Expression1[] membersToExpand)\r\n at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression
1 [] membersToExpand)\ r \ n) Sy上的GetResult()\ r \ n 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 ---從上一個位置結束堆棧跟蹤在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務)上運行System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任務任務)\ r \ n時拋出異常--- \ r \ n \ .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(個)\ r \ n在System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()」
這不起作用。我已經嘗試過了。而且項目有一對多的關係。如果你將檢查映射配置的類別,你可以很容易地找出它有一對多的關係。 –
請嘗試再做一次,併發布異常。 –
我沒有看到一對多的問題,現在異常告訴你,你嘗試將類別轉換爲列表,所以請儘量做我寫的併發布我的其他異常。 –