C# 来自字符串的Linq排序方向
我正在尝试对一组用户进行排序。我可以访问排序属性和方向(asc、desc)。我当前的查询订单如下。但正如您所看到的,它并不能解释排序方向。如何在不必使用动态Linq或为“asc”或“desc”排序方向添加另一组语句的情况下构建此表达式C# 来自字符串的Linq排序方向,c#,linq,linq-to-sql,sorting,sortdirection,C#,Linq,Linq To Sql,Sorting,Sortdirection,我正在尝试对一组用户进行排序。我可以访问排序属性和方向(asc、desc)。我当前的查询订单如下。但正如您所看到的,它并不能解释排序方向。如何在不必使用动态Linq或为“asc”或“desc”排序方向添加另一组语句的情况下构建此表达式 public override IQueryable<DalLinq.User> GetSort(IQueryable<DalLinq.User> query) { //SelectArgs.SortDirection <-
public override IQueryable<DalLinq.User> GetSort(IQueryable<DalLinq.User> query)
{
//SelectArgs.SortDirection <- Sort Direction
switch (SelectArgs.SortProperty)
{
case "LastName":
query = query.OrderBy(p => p.LastName);
break;
case "FirstName":
query = query.OrderBy(p => p.FirstName);
break;
default:
query = query.OrderBy(p => p.UserName);
break;
}
return query;
}
public覆盖IQueryable GetSort(IQueryable查询)
{
//选择args.SortDirection p.LastName);
打破
案例“名字”:
query=query.OrderBy(p=>p.FirstName);
打破
违约:
query=query.OrderBy(p=>p.UserName);
打破
}
返回查询;
}
我认为这应该是一个if语句,没有其他简单的方法可以做到,即:
query = (SelectArgs.SortDirection == "asc") ? query.OrderBy(p => p.LastName)
: query.OrderByDescending(p => p.LastName);
也可以看看这个:理想情况下,您希望使用
OrderByDescending
-您当然可以作弊:
public static class MyExtensionMethods
{
public static IOrderedQueryable<TSource> OrderBy<TSource,TValue>(
this IQueryable<TSource> source,
Expression<Func<TSource,TValue>> selector,
bool asc)
{
return asc ? source.OrderBy(selector) : source.OrderByDescending(selector);
}
}
公共静态类MyExtensionMethods
{
公共静态IOrderedQueryable OrderBy(
这是可靠的消息来源,
表达式选择器,
布尔(asc)
{
返回asc?source.OrderBy(选择器):source.OrderByDescending(选择器);
}
}
并使用OrderBy
传入选择器和bool
如果您不需要静态类型,当然也可以从头开始动态构建表达式,就像(本质上类似于动态LINQ库)。看看CS代码示例。这里有一个动态Linq示例 从样本中:
Northwind db = new Northwind(connString);
db.Log = Console.Out;
var query =
db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
OrderBy("CompanyName").
Select("New(CompanyName as Name, Phone)");
按代码排序:
public static IQueryable<T> OrderBy<T>(this IQueryable<T> source, string ordering, params object[] values) {
return (IQueryable<T>)OrderBy((IQueryable)source, ordering, values);
}
public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) {
if (source == null) throw new ArgumentNullException("source");
if (ordering == null) throw new ArgumentNullException("ordering");
ParameterExpression[] parameters = new ParameterExpression[] {
Expression.Parameter(source.ElementType, "") };
ExpressionParser parser = new ExpressionParser(parameters, ordering, values);
IEnumerable<DynamicOrdering> orderings = parser.ParseOrdering();
Expression queryExpr = source.Expression;
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
foreach (DynamicOrdering o in orderings) {
queryExpr = Expression.Call(
typeof(Queryable), o.Ascending ? methodAsc : methodDesc,
new Type[] { source.ElementType, o.Selector.Type },
queryExpr, Expression.Quote(Expression.Lambda(o.Selector, parameters)));
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}
return source.Provider.CreateQuery(queryExpr);
}
public静态IQueryable OrderBy(此IQueryable源,字符串排序,参数对象[]值){
return(IQueryable)OrderBy((IQueryable)源、顺序、值);
}
公共静态IQueryable OrderBy(此IQueryable源、字符串排序、参数对象[]值){
如果(source==null)抛出新的ArgumentNullException(“source”);
if(ordering==null)抛出新的ArgumentNullException(“ordering”);
ParameterExpression[]参数=新的ParameterExpression[]{
Expression.Parameter(source.ElementType,“”)};
ExpressionParser=新的ExpressionParser(参数、顺序、值);
IEnumerable orderings=parser.ParseOrdering();
表达式queryExpr=source.Expression;
string methodAsc=“OrderBy”;
string methodDesc=“OrderByDescending”;
foreach(订单中的动态记录){
queryExpr=Expression.Call(
typeof(可查询),o.升序?methodAsc:methodDesc,
新类型[]{source.ElementType,o.Selector.Type},
queryExpr,Expression.Quote(Expression.Lambda(o.Selector,parameters));
methodAsc=“ThenBy”;
methodDesc=“然后按降序”;
}
返回source.Provider.CreateQuery(queryExpr);
}
但一定要检查用户输入 很好,谢谢。我将bool更改为使用System.ComponentModel.ListOrtDirection an
IBindingList
/IBindingListView
,然后?我们曾经有过“有一个应用程序用于该”的时尚,