今天找了半天资料,有两种种方法:
1、把字符串参数变为lambda表达式
2、使用System.Linq.dynamic引用
这里我讲第二种方法
第一步:nuget搜索关键字“dynamicquery”或者直接使用Github项目里面的(这里要新一点)
第二步、添加这个引用,using使用命名空间
第三步、使用linq的时候OrderBy("orderName asc")就可以了【降序把asc改为desc】
先开始以为没有降序方法,后面把dll打开,发现代码如下
1 public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values) 2 { 3 if (source == null) 4 { 5 throw new ArgumentNullException("source"); 6 } 7 if (ordering == null) 8 { 9 throw new ArgumentNullException("ordering"); 10 } 11 ParameterExpression[] parameters = new ParameterExpression[1] 12 { 13 Expression.Parameter(source.ElementType, "") 14 }; 15 ExpressionParser expressionParser = new ExpressionParser(parameters, ordering, values); 16 IEnumerable<DynamicOrdering> enumerable = expressionParser.ParseOrdering(); 17 Expression expression = source.Expression; 18 string text = "OrderBy"; 19 string text2 = "OrderByDescending"; 20 foreach (DynamicOrdering item in enumerable) 21 { 22 expression = Expression.Call(typeof(Queryable), item.Ascending ? text : text2, new Type[2] 23 { 24 source.ElementType, 25 item.Selector.Type 26 }, expression, Expression.Quote(Expression.Lambda(item.Selector, parameters))); 27 text = "ThenBy"; 28 text2 = "ThenByDescending"; 29 } 30 return source.Provider.CreateQuery(expression); 31 }
发现排序跟ParseOrdering()方法有关,继续进入查看:
1 public IEnumerable<DynamicOrdering> ParseOrdering() 2 { 3 List<DynamicOrdering> list = new List<DynamicOrdering>(); 4 while (true) 5 { 6 Expression selector = this.ParseExpression(); 7 bool ascending = true; 8 if (this.TokenIdentifierIs("asc") || this.TokenIdentifierIs("ascending")) 9 { 10 this.NextToken(); 11 } 12 else if (this.TokenIdentifierIs("desc") || this.TokenIdentifierIs("descending")) 13 { 14 this.NextToken(); 15 ascending = false; 16 } 17 list.Add(new DynamicOrdering 18 { 19 Selector = selector, 20 Ascending = ascending 21 }); 22 if (this.token.id != TokenId.Comma) 23 { 24 break; 25 } 26 this.NextToken(); 27 } 28 this.ValidateToken(TokenId.End, "Syntax error"); 29 return list; 30 }
所以用法是OrderBy("orderName asc")这样的。
也可以使用其他功能,实现linq动态查询。