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