【问题标题】:Odata Query can't be translated from Linq无法从 Linq 翻译 Odata 查询
【发布时间】: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


【解决方案1】:

我有同样的问题,不仅是在单个结果上,在我尝试过滤子集合时也是如此。问题似乎是实体框架 3.1.0。看起来像实体框架 3.1.0。如果无法将查询转换为 sql 查询,则会引发异常。之前,ef core 执行一个查询来获取内存中的所有数据,然后处理查询。 我的解决方案是使用 FirstOrDefault 或 ToList().AsQueryable()。但是,当然,如果我们的表中有大量数据,这可能会导致性能问题。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2023-04-02
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多