私は、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、IDictionary2 typePairCount)\r\n at AutoMapper.QueryableExtensions.ExpressionBuilder.CreateMapExpression(ExpressionRequest request, IDictionary
2 typePairCount)\ r \ n2.<>c__DisplayClass2_1.<.ctor>b__1()\r\n at System.Lazy
1.CreateValue()\ AutoMapper.LockingConcurrentDictionaryの1.get_Value()\ r \ n AutoMapper.QueryableExtensions.ProjectionExpression.To [IDesult2 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__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
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.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で()」
これは機能しません。私はすでにそれを試しました。また、プロジェクトには1対多のリレーションシップがあります。マッピングの設定をカテゴリごとにチェックすると、1対多の関係があることを簡単に把握できます。 –
もう一度やってみてください。 –
1対多の問題は表示されませんが、今すぐ例外はカテゴリーをリストに変換しようとしていることを伝えていますので、私が書いたことをしてください。 –