我正在嘗試部署一個使用簡單標簽系統的簡單搜索功能,可能有更好的方法可以解決這個問題,這是我找到的解決方案:
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結果無法轉換為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.
′′′
uj5u.com熱心網友回復:
由于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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347483.html
標籤:C# asp.net核心 视觉工作室2010 asp.net-web-api azure-web-app-service
