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

问题描述 投票:0回答:4

我正在尝试让以下代码正常工作,这对于 SQL Server 来说工作正常,但自从我更改为使用 MySQL 后,它就不起作用了。

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

我收到错误:

无法加载一种或多种请求的类型。检索 LoaderExceptions 属性了解更多信息。

string colName = "datedD" ; 

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

c# mysql asp.net-mvc entity-framework dynamic-linq
4个回答
66
投票

在.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));

4
投票

试试这个

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

3
投票

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

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


1
投票

对于动态排序,我发现最方便的方式:

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 库 - Linq-Dynamic

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

© www.soinside.com 2019 - 2024. All rights reserved.