Запрос Одата не может быть переведен с Linq - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь заставить работать OData Query. Net Core 3.1

Все работало нормально. Net Core 2.1 теперь после обновления выдает

System.InvalidOperationException: не удалось перевести выражение LINQ '$ it'. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ().

У меня есть две таблицы

    public class WorkItem
    {
        [Key]
        [Required]
        public Guid Id { get; set; }

        [Required]
        [MaxLength(128)]
        public string Name { get; set; }

        public IEnumerable<Resource> Resources { get; set; }

        public WorkItem(string name)
        {      
            Name = name;
        }
    }

public class Resource
    {
        [Key]
        [Required]
        public Guid Id { get; set; }

        [Required]
        public Guid WorkItemId { get; set; }

        [Required]
        [MaxLength(128)]
        public string Name { get; set; }

        [Required]
        public Guid StorageId { get; set; }

        public DateTime CreateDate { get; set; }

        public ContentItem ContentItem { get; set; }

        public AppItem AppItem { get; set; }

        public Resource(Guid workItemId, string name, Guid storageId)
        {
            WorkItemId = workItemId;
            Name = name;
            StorageId = storageId;
        }
    }

, и тогда запрос uri выглядит следующим образом:

_appItemsBaseUri / response.Id ? $ Expand = Resources ($ filter = Name eq 'test2.pdf') ";

он успешно поразил API, отфильтровывает данные и создает Odata SingleResult. Если развернуть его, я вижу, что существует WorkItem и ресурс есть.

var dto = dataset.Where(workItemId==responseId);
var res = SingleResult.Create(dto);

Но он не возвращается из API, когда я выполняю

// This results in the error mentioned above.
return Ok(res);

, единственный способ заставить его работать - это использовать его следующим образом ...

var dto = dataset.Where(workItemId==responseId);
var res = SingleResult.Create(dto).Queryable.FirstOrDefault();
return Ok(res)

Я использую следующие версии пакетов Microsoft.AspNetCore.Odata 7.3.0 Microsoft.EntityFrameworkCore 3.1.0

Подскажите, пожалуйста, как я могу вернуть данные без необходимости выполнять оценку клиента (.Queryable.FirstOrDefault ())? и что причина в том, что код должен выполнять оценку клиента, потому что нет кода, который требует оценки клиента, который я могу увидеть?

1 Ответ

0 голосов
/ 29 марта 2020

У меня та же проблема не только с одним результатом, но и при попытке отфильтровать дочернюю коллекцию. Кажется, проблема в Entity Framework 3.1.0. Похоже, Entity Framework 3.1.0. выдает исключение, если запрос не может быть переведен в sql запрос. Раньше ef core выполнял запрос, чтобы получить все данные в памяти и обработать запрос после. Для меня решение было использовать либо FirstOrDefault или ToList (). AsQueryable (). Но, конечно, это может привести к проблемам с производительностью, если у нас много данных в таблице / с.

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