Search code examples
c#asp.netasp.net-coreasp.net-core-mvcpagedlist

InvalidCastException: Unable to cast object of type 'System.Linq.OrderedEnumerable to type 'System.Collections.Generic.List


In my ASP.NET 4.8 web app, the following works; I'm using PagedList for pagination:

private AppDbContext db = new AppDbContext();
private IQueryable<Border> Broders;

public ViewResult Index(int? page)
{
    Broders = from s in db.Broders select s;

    if (SearchColumn == "T1")
    {
        Borders = Broders.Where(s => s.TagT1.ToString().Contains(searchString));
    }
    else if (SearchColumn == "T2")
    {
        Borders = Broders.Where(s => s.TagT2.ToString().Contains(searchString));
    }

    switch (sortOrder)
    {
        case "status_desc":
            Borders = Borders.OrderByDescending(s => s.Status);
            break;

        case "status_desc":
            Borders = Borders.OrderByDescending(s => s.Status);
            break;

        default:
            Borders = Borders.OrderByDescending(s => s.CreatedOn);
            break;
    }

    int pageSize = 10;
    int pageNumber = (page ?? 1);

    return View(Borders.ToPagedList(pageNumber, pageSize));
}

I do this in an ASP.NET Core 8 MVC app using X.PagedList for pagination:

private readonly AppDbContext _context;
private IQueryable<Broder> Borders;

public async Task<IActionResult> Index(int? page)
{
    var Borders = await _context.Borders.ToListAsync();

    if (SearchColumn == "T1")
    {
        Borders = (List<Initiative>)Broders.Where(s => s.TagT1.ToString().Contains(searchString));
    }
    else if (SearchColumn == "T2")
    {
        Borders = (List<Initiative>)Broders.Where(s => s.TagT2.ToString().Contains(searchString));
    }

    switch (sortOrder)
    {
        case "status_desc":
            Borders = (List<Initiative>)Borders.OrderByDescending(s => s.Status);
            break;

        case "status_desc":
            Borders = (List<Initiative>)Borders.OrderByDescending(s => s.Status);
            break;

        default:
            Borders = (List<Initiative>)Borders.OrderByDescending(s => s.CreatedOn);
            break;
    }

    int pageSize = 10;
    int pageNumber = (page ?? 1);

    return View(Borders.ToPagedList(pageNumber, pageSize));     
}

This ASP.NET Core code throws an error

InvalidCastException: Unable to cast object of type 'System.Linq.OrderedEnumerable2[Map.Models.Border,System.String]' to type 'System.Collections.Generic.List1[Map.Models.Border]'

at line

Borders = (List<Initiative>)Borders.OrderByDescending(s => s.CreatedOn);

I'm new to ASP.NET Core, this is my first application. Can someone tell me what mistake I am making in my ASP.NET core method?


Solution

  • From this line:

    var Borders = await _context.Borders.ToListAsync();
    

    you are declaring Borders which is a List<Border> type.

    Changes:

    1. Declare the Borders as IQueryable<Border> with .AsQueryable().

    2. Remove casting to List<Initiative> which seems unnecessary.

    3. Don't need to create variable with global scope: private IQueryable<Broder> Borders;

    public async Task<IActionResult> Index(int? page)
    {
        IQueryable<Broder> Borders = _context.Borders.AsQueryable();
        if (SearchColumn == "T1")
        {
            Borders = Borders.Where(s => s.TagT1.ToString().Contains(searchString));
        }
        else if (SearchColumn == "T2")
        {
            Borders = Borders.Where(s => s.TagT2.ToString().Contains(searchString));
        }
        switch (sortOrder)
        {
            case "status_desc":
                Borders = Borders.OrderByDescending(s => s.Status);
                break;
            case "status_desc":
                Borders = Borders.OrderByDescending(s => s.Status);
                break;
            default:
                Borders = Borders.OrderByDescending(s => s.CreatedOn);
                break;
        }
        int pageSize = 10;
        int pageNumber = (page ?? 1);
        return View(Borders.ToPagedList(pageNumber, pageSize));     
    }