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