如何在 asp net core web API 上正确地将列表转换为 IQueryable

How to properly convert a list to IQueryable on a asp net core web API

我正在尝试部署一个使用简单标签系统的简单搜索功能,可能有更好的方法 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.
´´´

由于resultsList<>类型的局部变量,我认为您不需要等待最后一行。它可能只适用于:

return results.AsQueryable();

在这种情况下,您的方法甚至可能不需要是 async 方法。或者,根据 _context 是什么,也许 await 需要在 pubs 过滤器调用中:

pubs = await pubs.Where(s => (s.tag.Contains(Itag) && s.estatus<2))
                 .OrderBy(x => x.estatus)
                 .ToListAsync();

此外,由于您的方法说 returns 和 IEnumerable<>,您可能不需要 .AsQueryable(),或者:

return result;

您还可以进行很多重构——以下是您可能需要考虑的几件事:

  • String.IsNullOrEmpty(tag) 检查移动到方法的开头作为守卫。
  • 如果这是用户输入,trim TagList 中的拆分标签以避免任何额外空格的问题,然后确保删除任何产生的空成员。
  • 您可以将 estatus < 2 检查放入您的查询中,以减少为每个 ITag.
  • 中的每个项目重新检查它的必要性