Не удалось перевести выражение LINQ OrderBy DateTimeOffset.DateTime.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Не удалось перевести выражение LINQ OrderBy DateTimeOffset.DateTime.

Сообщение Anonymous »

У меня есть проект .NET Core, в котором я реализовал этот запрос GraphQL. Запрос работает корректно, но сортировка по дате не работает.

Код: Выделить всё

[UsePaging(MaxPageSize = 200, IncludeTotalCount = true)]
[UseProjection]
[UseFiltering]
[UseSorting]
public async Task UserMetadatas(string myValue, [Service] ActivityEngineDataContext context,[Service] IMapper mapper)
{
var entities = context.Users.Where(act => act.MyValue== myValue);
return entities.ProjectTo(mapper.ConfigurationProvider);
}
Используя AutoMapper, я создал следующую проекцию для сопоставления объекта с DTO.

Код: Выделить всё

CreateProjection()
.ForMember(dest => dest.CreationDate, opt => opt.MapFrom(s => s.CreationDate.DateTime))
.ForMember(dest => dest.LastUpdateDate, opt => opt.MapFrom(s => s.LastUpdateDate.DateTime));
Мне пришлось создать эту проекцию, поскольку свойства класса User имеют тип DateTimeOffset, тогда как свойства класса UserDto имеют тип DateTime.
Когда я запускаю этот запрос с игровой площадки Banana Cake Pop

Код: Выделить всё

query{
activityInstancesMetadata(
myValue: "value"
where: {and: [{status: {eq: 32}}]}
order: {lastUpdateDate: ASC}
first: 20
) {
nodes {
creationDate
lastUpdateDate
id
status
}
totalCount
}
}
У меня такая ошибка:

Код: Выделить всё

"The LINQ expression 'DbSet()
.Where(a => a.MyValue== __myValue_0)
.OrderBy(a => a.LastUpdateDate.DateTime)' could not be translated.  Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'

at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.g__CheckTranslated|15_0(ShapedQueryExpression translated, c__DisplayClass15_0& )
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__DisplayClass9_0`1.b__0()
at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at System.Linq.Queryable.Count[TSource](IQueryable`1 source)
at HotChocolate.Types.Pagination.QueryableCursorPagingHandler`1.ResolveAsync(IResolverContext context, IQueryable`1 source, CursorPagingArguments arguments, CancellationToken cancellationToken)
at HotChocolate.Types.Pagination.CursorPagingHandler.HotChocolate.Types.Pagination.IPagingHandler.SliceAsync(IResolverContext context, Object source)
at HotChocolate.Types.Pagination.PagingMiddleware.InvokeAsync(IMiddlewareContext context)
at HotChocolate.Utilities.MiddlewareCompiler`1.ExpressionHelper.AwaitTaskHelper(Task task)
at HotChocolate.Execution.Processing.Tasks.ResolverTask.ExecuteResolverPipelineAsync(CancellationToken cancellationToken)
at HotChocolate.Execution.Processing.Tasks.ResolverTask.TryExecuteAsync(CancellationToken cancellationToken)"
Чтение трассировки стека и отладка показывают, что проблема вызвана Entity Framework, которая в методе OrderBy вставляет выражение, установленное в методе ForMember объекта Projection.
Чтение трассировки стека и отладка показывают, что проблема вызвана Entity Framework, которая в методе OrderBy вставляет выражение, установленное в методе ForMember объекта Projection.
p>
Что я пробовал до сих пор
  • Установите преобразование в DataContext таким образом

Код: Выделить всё

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(DateTimeOffset)
|| p.PropertyType == typeof(DateTimeOffset?));
foreach (var property in properties)
{
modelBuilder
.Entity(entityType.Name)
.Property(property.Name)
.HasConversion(new DateTimeOffsetToStringConverter());
}
}
}
  • Двойное приведение в проекции

Код: Выделить всё

CreateProjection()
.ForMember(dest => dest.CreationDate, opt => opt.MapFrom(s => (DateTime)(object)s.CreationDate))
.ForMember(dest => dest.LastUpdateDate, opt => opt.MapFrom(s =>  (DateTime)(object)s.LastUpdateDate));
Этот код работает, но я сталкиваюсь с другими проблемами при вызове запроса, возвращающего одну запись.
Есть ли способ решить эту проблему без использования «ToList» в запросе?
Примечание: это не дубликат запроса EF Core, только DateTime из DateTimeOffset не может быть переведен; Я пытался реализовать это решение, но в данном случае это не очень хорошо

Подробнее здесь: https://stackoverflow.com/questions/775 ... translated
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»