如何按 EntityFramework 中的动态列名排序?
how to order by a dynamic column name in EntityFramework?
我正在尝试让以下代码正常工作,这对 MSSQL 来说工作正常,但是由于我改为使用 mySql 它不起作用
records.Content = db.areas
.Where(x => x.Name.Contains(filter)))
.OrderBy("dated desc")
.ToList();
我收到错误“无法加载一种或多种请求的类型。检索 LoaderExceptions 属性 以获取更多信息。”
string colName = "datedD" ;
如何根据 colName 变量进行排序?
`
试试这个
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();
在.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));
我混合使用@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());
}
不好的是 - 我的代码将项目作为字符串进行比较。我没有时间让它变得更多 "type-friendly",但我很确定这是可能的。
对于动态排序,我发现最方便的方式:
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
该功能即使用于商业用途也是免费的。
我正在尝试让以下代码正常工作,这对 MSSQL 来说工作正常,但是由于我改为使用 mySql 它不起作用
records.Content = db.areas
.Where(x => x.Name.Contains(filter)))
.OrderBy("dated desc")
.ToList();
我收到错误“无法加载一种或多种请求的类型。检索 LoaderExceptions 属性 以获取更多信息。”
string colName = "datedD" ;
如何根据 colName 变量进行排序?
`
试试这个
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();
在.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));
我混合使用@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());
}
不好的是 - 我的代码将项目作为字符串进行比较。我没有时间让它变得更多 "type-friendly",但我很确定这是可能的。
对于动态排序,我发现最方便的方式:
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
该功能即使用于商业用途也是免费的。