Very similar problem as here #566
But I don't think that "materializing the query" is an acceptable workaround:
This WORKS (without using IMapper)
vartemplate=awaitquery.ProjectToType<TemplateDto>().FirstOrDefaultAsync();
This WORKS (with IMapper but FirstOrDefault)
vartemplate=_mapper.From(query).ProjectToType<TemplateDto>().FirstOrDefault();
This doesn't WORK (With IMapper but FirstOrDefaultAsync)
vartemplate=await_mapper.From(query).ProjectToType<TemplateDto>().FirstOrDefaultAsync();
And thows:
System.MissingMethodException
HResult=0x80131513
Message=Constructor on type 'Mapster.EFCore.MapsterAsyncEnumerable`1[[MessageDispatcher.Shared.Restful.Api.Dto.TemplateDto, MessageDispatcher.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' not found.
Source=System.Private.CoreLib
StackTrace:
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture)
at System.Activator.CreateInstance(Type type, Object[] args)
at Mapster.EFCore.MapsterQueryableProvider.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, Expression expression, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsync[TSource,TResult](MethodInfo operatorMethodInfo, IQueryable`1 source, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.FirstOrDefaultAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
at MessageDispatcher.Services.TemplateService.<GetTemplateByNameAsync>d__7.MoveNext() in C:\Users\Dell\source\repos\MessageDispatcher\MessageDispatcher\Services\TemplateService.cs:line 64
at MessageDispatcher.Controllers.TemplateController.<GetTemplateByName>d__3.MoveNext() in C:\Users\Dell\source\repos\MessageDispatcher\MessageDispatcher\Controllers\TemplateController.cs:line 38
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.<Execute>d__0.MoveNext()
at System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<<InvokeActionMethodAsync>g__Logged|12_1>d.MoveNext()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<<InvokeNextActionFilterAsync>g__Awaited|10_0>d.MoveNext()
The mapper itself
publicclassMapsterConfig:IRegister{publicvoidRegister(TypeAdapterConfigconfig){
...config.NewConfig<TemplateTranslationEntity,TemplateDto.TranslationDto>().ConstructUsing(locale =>newTemplateDto.TranslationDto(locale.Locale,locale.Text));config.NewConfig<TemplateEntity,TemplateDto>().ConstructUsing(template =>newTemplateDto(template.Name,template.Translations.Adapt<IReadOnlyList<TemplateDto.TranslationDto>>()));
...}}publicclassTemplateTranslationEntity{publiclongId{get;set;}publiclongTemplateId{get;set;}publicstringLocale{get;set;}=null!;publicstringText{get;set;}=null!;publicTemplateEntityTemplate{get;set;}=null!;publicLocaleEntityLocaleInfo{get;set;}=null!;}publicclassTemplateDto{[JsonPropertyName("name")]publicstringName{get;}[JsonPropertyName("translations")]publicIReadOnlyList<TranslationDto>Translations{get;}[JsonConstructor]publicTemplateDto(stringname,IReadOnlyList<TranslationDto>translations){Name=name;Translations=translations;}publicclassTranslationDto{[JsonPropertyName("languageCode")]publicstringLanguageCode{get;}[JsonPropertyName("content")]publicstringContent{get;}[JsonConstructor]publicTranslationDto(stringlanguageCode,stringcontent){LanguageCode=languageCode;Content=content;}}}Why does await query.ProjectToType is different from _mapper.From(query).ProjectToType?
NB! Switching from constructor to property mapping gave the same error.
Additional info:
.NET 9.0
Mapster 7.4.0
Mapster.EFCore 5.1.1
Mapster.DependencyInjection 1.0.1
Very similar problem as here #566
But I don't think that "materializing the query" is an acceptable workaround:
This WORKS (without using
IMapper)This WORKS (with
IMapperbutFirstOrDefault)This doesn't WORK (With
IMapperbutFirstOrDefaultAsync)And thows:
The mapper itself
Why does
await query.ProjectToTypeis different from_mapper.From(query).ProjectToType?NB! Switching from constructor to property mapping gave the same error.
Additional info:
.NET 9.0
Mapster 7.4.0
Mapster.EFCore 5.1.1
Mapster.DependencyInjection 1.0.1