Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Odata查询可以';不能从Linq翻译过来_C#_Asp.net Core_Odata_Ef Core 3.1 - Fatal编程技术网

C# Odata查询可以';不能从Linq翻译过来

C# Odata查询可以';不能从Linq翻译过来,c#,asp.net-core,odata,ef-core-3.1,C#,Asp.net Core,Odata,Ef Core 3.1,我正在尝试让OData查询在.NETCore3.1上运行 在.NETCore2.1上一切正常 现在升级后它说 System.InvalidOperationException:无法找到LINQ表达式“$it” 翻译。或者将查询重写为可以 转换,或通过插入 调用AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或 ToListSync() 我有两张桌子 公共类工作项 { [关键] [必需] 公共Guid Id{get;set;} [必需] [MaxLen

我正在尝试让OData查询在.NETCore3.1上运行

在.NETCore2.1上一切正常 现在升级后它说

System.InvalidOperationException:无法找到LINQ表达式“$it” 翻译。或者将查询重写为可以 转换,或通过插入 调用AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或 ToListSync()

我有两张桌子

公共类工作项
{
[关键]
[必需]
公共Guid Id{get;set;}
[必需]
[MaxLength(128)]
公共字符串名称{get;set;}
公共IEnumerable资源{get;set;}
公共工作项(字符串名称)
{      
名称=名称;
}
}
公共类资源
{
[关键]
[必需]
公共Guid Id{get;set;}
[必需]
公共Guid工作项ID{get;set;}
[必需]
[MaxLength(128)]
公共字符串名称{get;set;}
[必需]
公共Guid StorageId{get;set;}
公共日期时间CreateDate{get;set;}
公共ContentItem ContentItem{get;set;}
公共AppItem AppItem{get;set;}
公共资源(Guid工作项ID、字符串名称、Guid存储ID)
{
WorkItemId=WorkItemId;
名称=名称;
StorageId=StorageId;
}
}
然后请求uri如下所示:

\u appItemsBaseUri/response.Id?$expand=Resources($filter=Name eq'test2.pdf')”;

它成功地命中了api,过滤了数据并创建了ODataSingleResult。如果我展开它,我可以看到有一个工作项,资源就在那里

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();
返回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()。但当然,如果表中有大量数据,这可能会导致性能问题。

您能分享更多有关api和Startup.cs的详细信息吗?有问题的更新吗?有类似问题吗