Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自字符串的Linq排序方向_C#_Linq_Linq To Sql_Sorting_Sortdirection - Fatal编程技术网

C# 来自字符串的Linq排序方向

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 <-

我正在尝试对一组用户进行排序。我可以访问排序属性和方向(asc、desc)。我当前的查询订单如下。但正如您所看到的,它并不能解释排序方向。如何在不必使用动态Linq或为“asc”或“desc”排序方向添加另一组语句的情况下构建此表达式

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
,然后?我们曾经有过“有一个应用程序用于该”的时尚,