如何在 EntityFramework 中按动态列名排序? [复制]
Posted
技术标签:
【中文标题】如何在 EntityFramework 中按动态列名排序? [复制]【英文标题】:how to order by a dynamic column name in EntityFramework? [duplicate] 【发布时间】:2016-10-29 12:54:33 【问题描述】:我正在尝试使以下代码正常工作,这对 MSSQL 来说工作正常,但由于我改用 mysql 它不工作
records.Content = db.areas
.Where(x => x.Name.Contains(filter)))
.OrderBy("dated desc")
.ToList();
我收到错误“无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。”
string colName = "datedD" ;
如何根据 colName 变量进行排序? `
【问题讨论】:
我猜“字符串版本”是指所谓的“动态 LINQ”(或 System.Linq.Dynamic)。请添加dynamic-linq
标签并相应更新问题。
@Kas 你能检查我的答案吗,因为这似乎是解决这个问题的更好方法;D
试试这个库Entity Framework Plus Library - Linq-Dynamic。你也可以看看我的回答
【参考方案1】:
在.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));
【讨论】:
这应该是公认的答案 如果您不使用 .Net Core,请查看 @Taher Rahgooy 回答 here【参考方案2】:试试这个
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();
【讨论】:
是否可以停止重复此代码? db.areas .Where(x => x.Name.Contains(filter))) 你不能回答这个问题但是你可以使用动态 linq 很复杂 @Kas 你可以将db.areas.Where(x => x.Name.Contains(filter)))
的结果放入局部变量var query = ...
然后使用query = (isAscSorting) ? query.OrderBy(...) : query.OrderByDescending(...)
【参考方案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());
不好的是 - 我的代码将项目作为字符串进行比较。我没有时间让它更“类型友好”,但我很确定这是可能的。
【讨论】:
【参考方案4】:对于我发现的最方便的动态排序方式:
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
即使用于商业用途,该功能也是免费的。
【讨论】:
以上是关于如何在 EntityFramework 中按动态列名排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章