// *********************************************************************** // Assembly : FCS.Lib.Utility // Author : FH // Created : 01-01-2022 // // Last Modified By : FH // Last Modified On : 02-24-2022 // *********************************************************************** // // Copyright (C) 2022 FCS Frede's Computer Services. // This program is free software: you can redistribute it and/or modify // it under the terms of the Affero GNU General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // Affero GNU General Public License for more details. // // You should have received a copy of the Affero GNU General Public License // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // // // *********************************************************************** using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace FCS.Lib.Utility { /// /// Class QueryHelper. /// public static class QueryHelper { // https://stackoverflow.com/a/45761590 public static IQueryable OrderBy (this IQueryable q, string name, bool desc) { var entityType = typeof(TModel); var p = entityType.GetProperty(name); var m = typeof(QueryHelper) .GetMethod("OrderByProperty") ?.MakeGenericMethod(entityType, p.PropertyType); return(IQueryable) m.Invoke(null, new object[] { q, p , desc }); } public static IQueryable ThenBy (this IQueryable q, string name, bool desc) { var entityType = typeof(TModel); var p = entityType.GetProperty(name); var m = typeof(QueryHelper) .GetMethod("OrderByProperty") ?.MakeGenericMethod(entityType, p.PropertyType); return(IQueryable) m.Invoke(null, new object[] { q, p , desc }); } public static IQueryable OrderByProperty (IQueryable q, PropertyInfo p, bool desc) { var pe = Expression.Parameter(typeof(TModel)); Expression se = Expression.Convert(Expression.Property(pe, p), typeof(object)); var exp = Expression.Lambda>(se, pe); return desc ? q.OrderByDescending(exp) : q.OrderBy(exp); } }}