【发布时间】:2020-01-07 09:58:54
【问题描述】:
我正在尝试让 OData 查询在 .Net Core 3.1 上运行
.Net Core 2.1 一切正常 现在升级后它说
System.InvalidOperationException:LINQ 表达式“$it”不能 被翻译。要么重写查询形式, 翻译,或通过插入显式切换到客户端评估 调用 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()。
我有两张桌子
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 并且 Resource 在那里。
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())? 代码需要进行客户端评估的原因是什么,因为我可以看到没有需要客户端评估的代码?
【问题讨论】:
-
你能分享更多关于你的 api 和 Startup.cs 的细节吗?
-
关于这个问题的任何更新?有类似的问题
标签: c# asp.net-core odata ef-core-3.1