Я нахожусь в процессе консолидации запросов, чтобы минимизировать количество 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