gpt4 book ai didi

c# - 无法从 Linq 翻译 Odata 查询

转载 作者:行者123 更新时间:2023-12-04 10:47:41 25 4
gpt4 key购买 nike

我正在尝试让 OData 查询在 .Net Core 3.1 上工作

在 .Net Core 2.1 上一切正常
现在升级后它说

System.InvalidOperationException: The LINQ expression '$it' 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 either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().



我有两张 table

    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())?
代码需要进行客户端评估的原因是什么,因为没有我可以看到的需要客户端评估的代码?

最佳答案

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

关于c# - 无法从 Linq 翻译 Odata 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59626078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com