LINQ 通過動態生成lambda表示式,實現根據指定屬性名稱對序列進行排序
阿新 • • 發佈:2019-01-27
目前,對於Linq只是初步接觸,還不熟悉,做專案的時候想到一個問題,如果想要查詢任意欄位的排序結果集,該怎麼實現?
我們知道,T-SQL是非常容易解決這個問題,只要簡單通過拼接T-SQL就可以達到該效果。
那麼,Linq該怎麼實現呢?
網上查了很多資料,找到一種辦法就是通過自定義拓展方法方式實現,具體實現程式碼如下:
/// <summary> /// 根據指定屬性名稱對序列進行排序 /// </summary> /// <typeparam name="TSource">source中的元素的型別</typeparam> /// <param name="source">一個要排序的值序列</param> /// <param name="property">屬性名稱</param> /// <param name="descending">是否降序</param> /// <returns></returns> public static IQueryable<TSource> OrderBy<TSource>(this IQueryable<TSource> source, string property, bool descending) where TSource : class { ParameterExpression param = Expression.Parameter(typeof(TSource), "c"); PropertyInfo pi = typeof(TSource).GetProperty(property); MemberExpression selector = Expression.MakeMemberAccess(param, pi); LambdaExpression le = Expression.Lambda(selector, param); string methodName = (descending) ? "OrderByDescending" : "OrderBy"; MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(TSource), pi.PropertyType }, source.Expression, le); return source.Provider.CreateQuery<TSource>(resultExp); }
呼叫如下:
using (Entities entitys = new Entities())
{
var lists = Kits.OrderBy(entitys.Members.Where(n => true), "MemberId", true).ToList();
}
執行結果如下:
當然,你也可以加多點查詢條件,只要稍微修改下就可以了