2017-01-09 43 views
0

我在網上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.LockingConcurrentDictionary 2.<>c__DisplayClass2_1.<.ctor>b__1()\r\n at System.Lazy 1.CreateValue()\ pper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest請求,表達式instanceParameter,IDictionary 2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary 2 typePairCount)\ r \ r \ n at System.Lazy 1.LazyInitValue()\r\n at System.Lazy 1.get_Value()\ r \ n at AutoMapper.LockingConcurrentDictionary 2.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](IDictionary 2 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,Expression 1[] 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__3 1.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.TaskAwaiter 1.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()」

回答

1

我認爲項目是一對一的,你試試從類別到類別dtos列表投擲 因此,嘗試用此來回報項目。

.ProjectTo<CategoryDto>() 

PS。 從異常「Missing從CategoriesAndBrandsServices.Models.Category映射到System.Collections.Generic.List1 [CategoriesAndBrandsServices.Dtos.CategoryDto]。使用Mapper.CreateMap創建。」

+0

這不起作用。我已經嘗試過了。而且項目有一對多的關係。如果你將檢查映射配置的類別,你可以很容易地找出它有一對多的關係。 –

+0

請嘗試再做一次,併發布異常。 –

+1

我沒有看到一對多的問題,現在異常告訴你,你嘗試將類別轉換爲列表,所以請儘量做我寫的併發布我的其他異常。 –