Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心排序_C#_Sorting_Entity Framework Core - Fatal编程技术网

C# 实体框架核心排序

C# 实体框架核心排序,c#,sorting,entity-framework-core,C#,Sorting,Entity Framework Core,我尝试按如下方式对数据集进行排序: public async Task<ICollection<Article>> SortArticles(string sortOrder) { IQueryable<Article> articles = GetAll(); switch (sortOrder) { case "name_desc": articles.OrderByDescending(s

我尝试按如下方式对数据集进行排序:

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;
}
公共异步任务排序工具(字符串排序器)
{
IQueryable articles=GetAll();
开关(分拣机)
{
案例“名称描述”:
articles.OrderByDescending(s=>s.Name).AsQueryable();
打破
案件“日期”:
articles=articles.OrderBy(s=>s.DateCreated.AsQueryable();
案例“日期描述”:
articles=articles.OrderByDescending(s=>s.DateCreated).AsQueryable();
打破
违约:
articles.OrderBy(s=>s.Name).AsQueryable();
打破
}
var result=await articles.ToListAsync();
返回结果;
}
然而,我的结果总是以同样的方式排序


我做错了什么?

添加了缺少的中断,您也缺少排序的赋值

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;
}
公共异步任务排序工具(字符串排序器)
{
IQueryable articles=GetAll();
开关(分拣机)
{
案例“名称描述”:
articles=articles.OrderByDescending(s=>s.Name).AsQueryable();
打破
案件“日期”:
articles=articles.OrderBy(s=>s.DateCreated.AsQueryable();
打破
案例“日期描述”:
articles=articles.OrderByDescending(s=>s.DateCreated).AsQueryable();
打破
违约:
articles=articles.OrderBy(s=>s.Name).AsQueryable();
打破
}
var result=await articles.ToListAsync();
返回结果;
}

我可以为您的代码确定一些修复程序

  • 请在所有情况下使用
    break
  • 请对每个
    案例使用赋值运算符(
    articles=
  • 请从每个案例中删除不必要的
    AsQueryable
  • 请在每种情况下使用枚举而不是字符串,以提高可读性和性能
  • 枚举示例

    public enum Operator
    {
        PLUS, MINUS, MULTIPLY, DIVIDE
    }
    
    switch(op)
    {
         case Operator.PLUS:
         {
    
         }
         ...
    }
    

    可以为结果集的动态排序创建扩展方法。您需要使用属性参数作为数据库中的排序列

    您可以修改

    this IEnumerable<<TT>> source
    
    此IEnumerable源
    

    此IQueryable源
    
    如果需要或导致错误

        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);
        }
    
    公共静态IEnumerable排序(此IEnumerable源代码,bool isDescending,字符串属性)
    {
    如果(isDescending)
    {
    返回source.OrderByDescending(x=>x.GetReflectedPropertyValue(property));
    }
    其他的
    {
    返回source.OrderBy(x=>x.GetReflectedPropertyValue(property));
    }
    }
    私有静态对象GetReflectedPropertyValue(此对象主题,字符串属性)
    {
    返回subject.GetType().GetProperty(property).GetValue(subject,null);
    }
    
    您的代码似乎不一致,但我无法确定这是否是原因。您的第二个case语句缺少其“break;”,并且您的第一个和最后一个语句缺少其赋值。我已进行编辑,以包括
    case“date”的break仍然缺少
    break
    :。并且在某些情况下缺少
    文章=
    。我的编辑需要同行评审。@Daniaal请不要编辑问题来修改代码。我们不知道OP的代码是否真的有
    break或否。在堆栈溢出时,不鼓励使用仅代码的答案,特别是当不清楚您更改了什么时
    
        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);
        }