using PoweredSoft.DynamicLinq.Fluent; using PoweredSoft.DynamicLinq.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace PoweredSoft.DynamicLinq { public static class QueryableExtensions { public static IQueryable Where(this IQueryable query, string path, ConditionOperators conditionOperator, object value, QueryConvertStrategy convertStrategy = QueryConvertStrategy.ConvertConstantToComparedPropertyOrField, QueryCollectionHandling collectionHandling = QueryCollectionHandling.Any, StringComparison? stringComparision = null) { query = query.Query(qb => qb.Compare(path, conditionOperator, value, convertStrategy: convertStrategy, collectionHandling: collectionHandling, stringComparision: stringComparision)); return query; } public static IQueryable Where(this IQueryable query, Action> callback) => query.Query(callback); public static IQueryable Query (this IQueryable query, Action> callback) { var queryBuilder = new WhereBuilder(query); callback(queryBuilder); var ret = queryBuilder.Build(); return ret; } // generic. public static IQueryable OrderBy(this IQueryable query, string path, QueryOrderByDirection direction, bool append) { IQueryable queryable = query; query = queryable.OrderBy(path, direction, append) as IQueryable; return query; } public static IQueryable OrderBy(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Ascending, false); public static IQueryable OrderByDescending(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Descending, false); public static IQueryable ThenBy(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Ascending, true); public static IQueryable ThenByDescending(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Descending, true); // non generic. public static IQueryable OrderBy(this IQueryable query, string path, QueryOrderByDirection direction, bool append) { var qb = new OrderByBuilder(query); qb.OrderBy(path, direction, append); var ret = qb.Build(); return ret; } public static IQueryable OrderBy(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Ascending, false); public static IQueryable OrderByDescending(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Descending, false); public static IQueryable ThenBy(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Ascending, true); public static IQueryable ThenByDescending(this IQueryable query, string path) => query.OrderBy(path, QueryOrderByDirection.Descending, true); // group by public static IQueryable GroupBy(this IQueryable query, string path) => QueryableHelpers.GroupBy(query, typeof(T), path); public static IQueryable GroupBy(this IQueryable query, Type type, string path) => QueryableHelpers.GroupBy(query, type, path); public static IQueryable GroupBy(this IQueryable query, Action callback) => query.GroupBy(typeof(T), callback); public static IQueryable GroupBy(this IQueryable query, Type type, Action callback) { var groupBuilder = new GroupBuilder(); callback(groupBuilder); if (groupBuilder.Empty) throw new Exception("No group specified, please specify at least one group"); return QueryableHelpers.GroupBy(query, type, groupBuilder.Parts, groupBuilder.Type, groupBuilder.EqualityComparerType); } public static IQueryable Select(this IQueryable query, Action callback) { var sb = new SelectBuilder(); callback(sb); if (sb.Empty) throw new Exception("No select specified, please specify at least one select path"); return QueryableHelpers.Select(query, sb.Parts.Select(t => (selectType: t.SelectType, propertyName: t.PropertyName, path: t.Path)).ToList(), sb.DestinationType); } public static List ToObjectList(this IQueryable query) { var ret = new List(); foreach (var o in query) ret.Add(o); return ret; } public static List ToDynamicList(this IQueryable query) { var ret = new List(); foreach (var o in query) ret.Add(o); return ret; } } }