Home > front end >  How to properly convert a list to IQueryable on a asp net core web API
How to properly convert a list to IQueryable on a asp net core web API

Time:10-25

im trying to deploy a simple search function that uses a simple tag system, probably there are better ways to bt this is the solution i landed on:

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();
        } 

problem is that the List results cant be converted to IQueryable, this is the error stack. Any idea of how i can properly implement it ?

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

CodePudding user response:

Since results is a local variable of List<> type, I don't believe you need to await the last line. It might just work with:

return results.AsQueryable();

In which case, your method may not even need to be an async method. Or, depending on what _context is, perhaps the await needs to be on the pubs filter call:

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

Furthermore, since your method says it returns an IEnumerable<>, you probably don't need the .AsQueryable(), either:

return result;

There's also a lot of refactoring you could do -- here are just a few things you may want to consider:

  • Move the String.IsNullOrEmpty(tag) check to the beginning of the method as a guard.
  • If this is user input, trim the split tags in TagList to avoid any issues with extra whitespace, and then be sure to remove any resulting empty members.
  • You could put the estatus < 2 check in your query to reduce having to re-check it again for every item in pubs for every ITag.
  • Related