如何在EntityFramework中按动态列名排序

本文关键字:动态 排序 EntityFramework | 更新日期: 2023-09-27 17:52:45

我试图得到以下代码工作,这是工作良好的MSSQL,但因为我改变使用mySql它不工作

  records.Content = db.areas
                         .Where(x =>   x.Name.Contains(filter)))
                         .OrderBy("dated desc") 
                         .ToList();

我得到错误"无法加载一个或多个请求的类型"。获取LoaderExceptions属性以获取更多信息。"

string colName = "datedD" ; 

如何根据colName变量进行排序?
'

如何在EntityFramework中按动态列名排序

在。net Core中,我们可以使用EF.Property方法将属性的名称指定为字符串:

string sortColumn = "Price";
//IQueryable<Product> q = from p in myDbContext.Products select p;
q = q.OrderBy(p => EF.Property<object>(p, sortColumn));

试试这个

string filterString = "dated";
bool isAscSorting = false;
Func<dynamic, dynamic> orderingFunction = i =>
                                filterString == "dated" ? i.dated :
                                filterString == "something" ? i.columnx : "";
records.Content = (isAscSorting) ?
                      db.areas
                         .Where(x =>   x.Name.Contains(filter)))
                         .OrderBy(orderingFunction) 
                         .ToList()
                   :
                        db.areas
                         .Where(x =>   x.Name.Contains(filter)))
                         .OrderByDescending(orderingFunction) 
                         .ToList();

我使用了@NEER和@S的两个答案的组合。serposhan避免LINQ查询

IQueryable<area> filteredItems = db.areas.Where(x =>   x.Name.Contains(filter)));
IQueryable<area> orderedItems;
if (IsAscending)
{
    orderedItems = filteredItems.OrderBy(item => typeof(area).GetProperty(colName).GetValue(item).ToString());
}
else
{
    orderedItems = filteredItems.OrderByDescending(item => typeof(area).GetProperty(colName).GetValue(item).ToString());
}

糟糕的是——我的代码将项目作为字符串进行比较。我没有时间让它更"友好",但我很确定这是可能的。

对于动态排序,我找到了最方便的方法:

string propertyNameForOrdering = "UserName";
var list = context.Customers.OrderByDescendingDynamic(x => "x." + propertyNameForOrdering).ToList(); // DESC
var list = context.Customers.OrderByDynamic(x => "x." + propertyNameForOrdering).ToList(); // ASC

Entity Framework Plus Library - Linq-Dynamic