簡體   English   中英

如何在asp net core web API上正確地將列表轉換為IQueryable

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

我正在嘗試部署一個使用簡單標簽系統的簡單搜索功能,可能有更好的方法可以解決這個問題,這是我找到的解決方案:

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.
´´´

由於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();

此外,由於您的方法說它返回一個IEnumerable<> ,您可能不需要.AsQueryable() ,或者:

return result;

您還可以進行很多重構——以下是您可能需要考慮的一些事項:

  • String.IsNullOrEmpty(tag)檢查移到方法的開頭作為保護。
  • 如果這是用戶輸入,請修剪TagList的拆分標簽以避免任何額外空白的問題,然后確保刪除任何由此產生的空成員。
  • 您可以將estatus < 2檢查放在您的查詢中,以減少必須為每個ITag pubs每個項目再次重新檢查它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM