gpt4 book ai didi

c# - linq中的动态排序

转载 作者:太空狗 更新时间:2023-10-29 20:00:03 24 4
gpt4 key购买 nike

请考虑这种情况:

我有一个包含大约 50 个字段的类列表。我想要一个组合框,用户可以根据要排序的字段列表进行选择。例如,如果用户选择“F1”列表,则根据“F1”进行排序。

我不想对每个字段都使用 if-else 进行排序。我看到了这个主题:

Sorting a gridview when databinding a collection or list of objects

但我不能使用它的答案。我如何使用 Expression Tree 来达到这个目的?

谢谢

编辑 1):

根据亲爱的@Thom Smith 的回答,我写了这段代码:

 using (NorthwindModel1.NorthwindEntities2 ent = new NorthwindModel1.NorthwindEntities2())
{
var query = from o in ent.Orders
where o.OrderID < 10257
select o;

query.OrderBy("CustomerID", SortDirection.Ascending);

GridView1.DataSource = query;
GridView1.DataBind();
}

但是没有排序。如果我这样写代码:

GridView1.DataSource = query.OrderBy(o=>o.CustomerID);

它正在排序。问题出在哪里?

最佳答案

这是我为此使用的方法:

private IQueryable<T> OrderQuery<T>(IQueryable<T> query, OrderParameter orderBy)
{
string orderMethodName = orderBy.Direction == SortDirection.Ascending ? "OrderBy" : "OrderByDescending";
Type t = typeof(T);

var param = Expression.Parameter(t, "shipment");
var property = t.GetProperty(orderBy.Attribute);

/* We can't just call OrderBy[Descending] with an Expression
* parameter because the second type argument to OrderBy is not
* known at compile-time.
*/
return query.Provider.CreateQuery<T>(
Expression.Call(
typeof(Queryable),
orderMethodName,
new Type[] { t, property.PropertyType },
query.Expression,
Expression.Quote(
Expression.Lambda(
Expression.Property(param, property),
param))
));
}

OrderParameter 只是一个具有属性和方向的结构。

编辑:补充说明。

此方法来 self 的 DynamicOrderList 类,它是 OrderParameter 对象的列表。如果你只需要按一个字段排序,那么你可以稍微简化一下:

private IQueryable<T> OrderByDynamic<T>(this IQueryable<T> query, string attribute, SortDirection direction)
{
try
{
string orderMethodName = direction == SortDirection.Ascending ? "OrderBy" : "OrderByDescending";
Type t = typeof(T);

var param = Expression.Parameter(t);
var property = t.GetProperty(attribute);

return query.Provider.CreateQuery<T>(
Expression.Call(
typeof(Queryable),
orderMethodName,
new Type[] { t, property.PropertyType },
query.Expression,
Expression.Quote(
Expression.Lambda(
Expression.Property(param, property),
param))
));
}
catch (Exception) // Probably invalid input, you can catch specifics if you want
{
return query; // Return unsorted query
}
}

然后像这样使用它:

myQuery = myQuery.OrderByDynamic("name", SortDirection.Ascending);

编辑 2:

public IQueryable<T> OrderBy<T>(this IQueryable<T> query, string attribute, SortDirection direction)
{
return ApplyOrdering(query, attribute, direction, "OrderBy");
}

public IQueryable<T> ThenBy<T>(this IQueryable<T> query, string attribute, SortDirection direction)
{
return ApplyOrdering(query, attribute, direction, "ThenBy");
}

private IQueryable<T> ApplyOrdering<T>(IQueryable<T> query, string attribute, SortDirection direction, string orderMethodName)
{
try
{
if (direction == SortDirection.Descending) orderMethodName += "Descending";

Type t = typeof(T);

var param = Expression.Parameter(t);
var property = t.GetProperty(attribute);

return query.Provider.CreateQuery<T>(
Expression.Call(
typeof(Queryable),
orderMethodName,
new Type[] { t, property.PropertyType },
query.Expression,
Expression.Quote(
Expression.Lambda(
Expression.Property(param, property),
param))
));
}
catch (Exception) // Probably invalid input, you can catch specifics if you want
{
return query; // Return unsorted query
}
}

和:

myQuery=myQuery.OrderBy("name", SortDirection.Ascending).ThenBy("date", SortDirection.Descending);

关于c# - linq中的动态排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12495873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com