简体   繁体   中英

Entity Framework Core - Sorting

I'm trying to sort my data set like this:

public async Task<ICollection<Article>> SortArticles(string sortOrder)
{
    IQueryable<Article> articles = GetAll();
    switch (sortOrder)
    {
        case "name_desc": 
            articles.OrderByDescending(s => s.Name).AsQueryable();
        break;
        case "date":
            articles = articles.OrderBy(s => s.DateCreated).AsQueryable();
        case "date_desc":
            articles = articles.OrderByDescending(s => s.DateCreated).AsQueryable();
        break;
        default:
             articles.OrderBy(s => s.Name).AsQueryable();
        break;
    }
    var result = await articles.ToListAsync();
    return result;
}

However, my result is always the ordered same way.

What I'm doing wrong?

Added the missing break and you are also missing the assignment of the sort.

public async Task<ICollection<Article>> SortArticles(string sortOrder)
{
    IQueryable<Article> articles = GetAll();
    switch (sortOrder)
    {
        case "name_desc": 
            articles = articles.OrderByDescending(s => s.Name).AsQueryable();           
        break;
        case "date":
            articles = articles.OrderBy(s => s.DateCreated).AsQueryable();
            break;
        case "date_desc":
            articles = articles.OrderByDescending(s => s.DateCreated).AsQueryable();
            break;
        default:
             articles = articles.OrderBy(s => s.Name).AsQueryable();
            break;
    }
    var result = await articles.ToListAsync();
    return result;
}

You can create an extension method for the dynamic sorting of the result set. You need to use property parameters as sorting column in database.

You can modify the

this IEnumerable<<TT>> source

to

this IQueryable<<TT>> source

if required or causing an error.

    public static IEnumerable<T> Sort<T>(this IEnumerable<T> source, bool isDescending, string property)
    {
        if (isDescending)
        {
            return source.OrderByDescending(x => x.GetReflectedPropertyValue(property));
        }
        else
        {
            return source.OrderBy(x => x.GetReflectedPropertyValue(property));
        }
    }

    private static object GetReflectedPropertyValue(this object subject, string property)
    {
        return subject.GetType().GetProperty(property).GetValue(subject, null);
    }

I can identify some fixes for your code.

  1. Please use break with all cases.
  2. Please use assignment operator ( articles = )for every case .
  3. Please remove unnecessary AsQueryable from each case.
  4. Please use enum instead of string in each case for better readability and performance.

Enum Example

public enum Operator
{
    PLUS, MINUS, MULTIPLY, DIVIDE
}

switch(op)
{
     case Operator.PLUS:
     {

     }
     ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM