2017-01-09 13 views
0

私は、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を使い、必要なフィールドのみを選択します。 「CategoriesAndBrandsServices.Models.Categoryからマップが表示されないシステムに:私は次の例外

"exceptionMessage" を取得しています実行している間

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)); 
    }); 

} 

:マッピング設定で

var categories = await _context.Categories.Include(x => x.SubCategories) 
              .Where(c => c.IsActive) 
              .ProjectTo<List<CategoryDto>>() 
              .ToListAsync(); 

は、私のようなマッピングを定義し.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でp.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequestリクエスト、式instanceParameter、IDictionary 2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary 2 typePairCount)\ r \ n 2.<>c__DisplayClass2_1.<.ctor>b__1()\r\n at System.Lazy 1.CreateValue()\ AutoMapper.LockingConcurrentDictionaryの1.get_Value()\ r \ n AutoMapper.QueryableExtensions.ProjectionExpression.To [IDesult 2 parameters, IEnumerable 1 memberPathsToExpand]に、2つのパラメータ、MemberInfo [] membersToExpand)\ r \ nがあります。 AutoMapper.QueryableExtensions.Extensions.ProjectTo [受渡し](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)で、[TResult](オブジェクトパラメータ、式1[] membersToExpand)\r\n at AutoMapper.QueryableExtensions.Extensions.ProjectTo[TDestination](IQueryable source, IConfigurationProvider configuration, Object parameters, Expression 1 [] membersToExpand)の\ r \ nにあります。 GetResult()\ r \ n Sy .Step.Threads.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 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()の1.GetResult()\ r \ n - 前の場所からのスタックトレースの終わり例外がスローされました--- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク)で\ r \ n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスクタスク)で\ r \ n System.Runtimeに例外がスローされました。 .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。 例外から "CategoriesAndBrandsServices.Models.CategoryからSystem.Collections.Generic.List1 [CategoriesAndBrandsServices.Dtos.CategoryDto]へのマップがありません.Mapper.CreateMapを使用して作成してください。"

+0

これは機能しません。私はすでにそれを試しました。また、プロジェクトには1対多のリレーションシップがあります。マッピングの設定をカテゴリごとにチェックすると、1対多の関係があることを簡単に把握できます。 –

+0

もう一度やってみてください。 –

+1

1対多の問題は表示されませんが、今すぐ例外はカテゴリーをリストに変換しようとしていることを伝えていますので、私が書いたことをしてください。 –