如何在 ASP Net Core Web API 上正确地将列表转换为 IQueryable
Posted
技术标签:
【中文标题】如何在 ASP Net Core Web API 上正确地将列表转换为 IQueryable【英文标题】:How to properly convert a list to IQueryable on a asp net core web API 【发布时间】:2021-12-09 12:57:24 【问题描述】:我正在尝试部署一个使用简单标签系统的简单搜索功能,可能有更好的方法来bt这是我登陆的解决方案:
public async Task<ActionResult<IEnumerable<t_usuarios_pub>>> Gett_usuarios_pubByTag(string tag)
string[] TagList;
TagList = tag.Split(',');
List<t_usuarios_pub> results = new List<t_usuarios_pub>();
var pubs = from m in _context.t_usuarios_pub select m;
if (!String.IsNullOrEmpty(tag))
foreach (var Itag in TagList)
pubs = pubs.Where(s => (s.tag.Contains(Itag) && s.estatus<2)).OrderBy(x => x.estatus);
foreach(var x in pubs)
if (!results.Contains(x))
results.Add(x);
return await results.AsQueryable().ToListAsync();
问题是 List results 无法转换为 IQueryable,这是错误堆栈。 知道如何正确实施它吗?
System.InvalidOperationException:
The source 'IQueryable' doesn't implement 'IAsyncEnumerable<UserPostAPI.Models.t_usuarios_pub>'.
Only sources that implement 'IAsyncEnumerable' can be used for Entity Framework asynchronous operations.
´´´
【问题讨论】:
试试 AsEnumerable() 【参考方案1】:由于results
是List<>
类型的局部变量,我认为您不需要等待最后一行。它可能只适用于:
return results.AsQueryable();
在这种情况下,您的方法甚至可能不需要是 async
方法。或者,根据 _context
是什么,await
可能需要在 pubs
过滤器调用中:
pubs = await pubs.Where(s => (s.tag.Contains(Itag) && s.estatus<2))
.OrderBy(x => x.estatus)
.ToListAsync();
此外,由于您的方法说它返回 IEnumerable<>
,您可能也不需要 .AsQueryable()
:
return result;
您还可以进行很多重构——这里只是您可能需要考虑的几件事:
将String.IsNullOrEmpty(tag)
检查移到方法的开头作为保护。
如果这是用户输入,请修剪 TagList
中的拆分标签以避免出现任何多余空格的问题,然后确保删除任何生成的空成员。
您可以在查询中添加estatus < 2
检查,以减少对pubs
中每个ITag
中的每个项目的重新检查。
【讨论】:
以上是关于如何在 ASP Net Core Web API 上正确地将列表转换为 IQueryable的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Asp.net Core Web Api 中默认使用 Newtonsoft.Json?
如何在 ASP.NET Core Web API 中使用 MassTransit 事件总线?
如何在 asp.net core web api 中绑定 Json Query 字符串
ASP.NET Core Web API - 如何在中间件管道中隐藏 DbContext 事务?