- 
                Notifications
    
You must be signed in to change notification settings  - Fork 380
 
Open
Labels
Description
Very similar problem as here #566
But I don't think that "materializing the query" is an acceptable workaround:
This WORKS (without using IMapper)
var template = await query
	.ProjectToType<TemplateDto>()
	.FirstOrDefaultAsync();This WORKS (with IMapper but FirstOrDefault)
var template = _mapper.From(query)
	.ProjectToType<TemplateDto>()
	.FirstOrDefault();This doesn't WORK (With IMapper but FirstOrDefaultAsync)
var template = 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
public class MapsterConfig : IRegister
{
    public void Register(TypeAdapterConfig config)
    {
        ...
        config.NewConfig<TemplateTranslationEntity, TemplateDto.TranslationDto>()
            .ConstructUsing(locale => new TemplateDto.TranslationDto(locale.Locale, locale.Text));
        config.NewConfig<TemplateEntity, TemplateDto>()
            .ConstructUsing(template => new TemplateDto(template.Name, template.Translations.Adapt<IReadOnlyList<TemplateDto.TranslationDto>>()));
		...
    }
}
public class TemplateTranslationEntity
{
    public long Id { get; set; }
    public long TemplateId { get; set; }
    public string Locale { get; set; } = null!;
    public string Text { get; set; } = null!;
    public TemplateEntity Template { get; set; } = null!;
    public LocaleEntity LocaleInfo { get; set; } = null!;
}
public class TemplateDto
{
    [JsonPropertyName("name")]
    public string Name { get; }
    [JsonPropertyName("translations")]
    public IReadOnlyList<TranslationDto> Translations { get; }
    [JsonConstructor]
    public TemplateDto(string name, IReadOnlyList<TranslationDto> translations)
    {
        Name = name;
        Translations = translations;
    }
    public class TranslationDto
    {
        [JsonPropertyName("languageCode")]
        public string LanguageCode { get; }
        [JsonPropertyName("content")]
        public string Content { get; }
        [JsonConstructor]
        public TranslationDto(string languageCode, string content)
        {
            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