如何通过EntityFramework中的动态列名进行排序?

时间:2016-06-27 13:23:35

标签: c# mysql asp.net-mvc entity-framework dynamic-linq

我正在努力让以下代码正常工作,这对MSSQL工作正常,但由于我改为使用mySql,它无法正常工作

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

我收到错误“无法加载一个或多个请求的类型。请检索LoaderExceptions属性以获取更多信息。”

string colName = "datedD" ; 

如何通过在colName变量上进行排序? `

4 个答案:

答案 0 :(得分:7)

在asp.net mvc核心2中,可以使用EF.Property方法将属性的名称指定为字符串:

string sortColumn = "Price";

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

我不确定我们可以从哪个版本使用它。

答案 1 :(得分:3)

试试这个

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

答案 2 :(得分:0)

我使用@NEER和@ S.Serpooshan的两个答案的组合来避免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());
}

不好的是-我的代码将项目作为字符串进行比较。我没有时间使其变得更“友好类型”,但我很确定这是可能的。

答案 3 :(得分:0)

对于动态订购,我发现的最便捷的方法是:

var list = context.Customers.OrderByDescendingDynamic(x => "x.Name").ToList();

var list = context.Customers.OrderByDynamic(x => "x.Name").ToList();

Entity Framework Plus Library - Linq-Dynamic

即使是商业用途,该功能也是免费的。