1. 程式人生 > >LINQ 通過動態生成lambda表示式,實現根據指定屬性名稱對序列進行排序

LINQ 通過動態生成lambda表示式,實現根據指定屬性名稱對序列進行排序

目前,對於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();                
            }

執行結果如下:


當然,你也可以加多點查詢條件,只要稍微修改下就可以了