如何在 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.
´´´
由于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();
此外,由于您的方法说 returns 和 IEnumerable<>
,您可能不需要 .AsQueryable()
,或者:
return result;
您还可以进行很多重构——以下是您可能需要考虑的几件事:
- 将
String.IsNullOrEmpty(tag)
检查移动到方法的开头作为守卫。
- 如果这是用户输入,trim
TagList
中的拆分标签以避免任何额外空格的问题,然后确保删除任何产生的空成员。
- 您可以将
estatus < 2
检查放入您的查询中,以减少为每个 ITag
. 中的每个项目重新检查它的必要性
我正在尝试部署一个使用简单标签系统的简单搜索功能,可能有更好的方法 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.
´´´
由于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();
此外,由于您的方法说 returns 和 IEnumerable<>
,您可能不需要 .AsQueryable()
,或者:
return result;
您还可以进行很多重构——以下是您可能需要考虑的几件事:
- 将
String.IsNullOrEmpty(tag)
检查移动到方法的开头作为守卫。 - 如果这是用户输入,trim
TagList
中的拆分标签以避免任何额外空格的问题,然后确保删除任何产生的空成员。 - 您可以将
estatus < 2
检查放入您的查询中,以减少为每个ITag
. 中的每个项目重新检查它的必要性