AutoMapper ProjectTo генерирует исключение NullReferenceException для комбинированных запросов с EFCore - PullRequest
2 голосов
/ 15 января 2020

Я нахожусь в процессе консолидации запросов, чтобы минимизировать количество SQL поездок туда и обратно. Для результатов с Skip Take, похоже, есть проблема с методом ProjectTo AutoMapper.

Работает:

var totalUsers = await _dbContext.UserAccounts.CountAsync(cancellationToken);
var users = await _dbContext.UserAccounts
   .Skip(skip).Take(take)
   .ProjectTo<UserProjection>(_mapper.ConfigurationProvider)
   .ToListAsync(cancellationToken);

Выдает исключение NullReferenceException:

// query
var query = from _ in _dbContext.UserAccounts
    select new
    {
        TotalUserCount = _dbContext.UserAccounts.Count(),

        Users = _dbContext.UserAccounts
            .Skip(skip).Take(take)
            .ProjectTo<UserProjection>(_mapper.ConfigurationProvider)
            .ToList()
    };
var result = await query.FirstOrDefaultAsync(cancellationToken);

Stack :

NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта. Microsoft.EntityFrameworkCore.Query.SqlExpressions.SelectExpression.AddCollectionProjection (ShapedQueryExpression shapedQueryExpression, INavigation навигация, тип ElementType) Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit (выражение Expression) Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.VisitNew (значение ВыраженияNew значение ВыраженияNew ) System.Linq.Expressions.NewExpression.Accept (посетитель ExpressionVisitor) Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit (выражение Expression) .Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect (источник ShapedQueryExpression, селектор LambdaExpression) Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslating ExpressionVisitor.VisitMethodCall (MethodCallExpression methodCallExpression) Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall (MethodCallExpression methodCallExpression) System.Linq.Expressions.MethodCallExpression.Accept (ExpressionVisitor посетителя) Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall (MethodCallExpression methodCallExpression) Microsoft.EntityFrameworkCore. Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall (methodCallExpression methodCallExpression) System.Linq.Expressions.MethodCallExpression.Accept (ExpressionVisitor посетителя) Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor (Выражение запроса) Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery (Выражение запроса, BOOL ASYN c) Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore (база данных ID, запрос выражений, модель IModel, bool as yn c) Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler + <> c__DisplayClass12_0.b__0 () Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache. .CompiledQueryCache.GetOrAddQuery (объект cacheKey, компилятор Fun c>) (выражение выражение, CancellationToken CancellationToken) Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsyn c (MethodInfo operatorMethodInfo, IQueryable источник, выражение выражение, CancellationToken CancellationToken) Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteAsyn c (MethodInfo operatorMethodInfo, IQueryable источник, CancellationToken CancellationToken) Microsoft.EntityFrameworkCor e.EntityFrameworkQueryableExtensions.FirstOrDefaultAsyn c (IQueryable source, CancellationToken cancellationToken)

Проблема возникает особенно в сочетании с Skip and Take.

Любая идея, которая может быть причиной этого ? Или это ошибка AutoMapper?

Пример кода взят из ASP. NET Core 3.1 приложения с текущей версией AutoMapper

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...