using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Data; using System.Collections; using Bowin.Common.Utility; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Conventions; using Newtonsoft.Json.Linq; using Newtonsoft.Json; namespace Bowin.Common.Linq.Entity { /// /// Helper extensions for add IDbSet methods defined only /// for DbSet and ObjectQuery /// public static class IQueryableExtensions { /// /// 映射。 /// /// /// /// public static ExpressionFactory Map(this IQueryable queryable) { return new ExpressionFactory(queryable); } public static IGridResultSet ToGridResultSet(this IOrderedEnumerable dataSource, int? pageIndex = null, int? pageSize = null) { if (pageIndex.HasValue && pageSize.HasValue) { return new GridResultSet { rows = dataSource.Skip((pageIndex.Value - 1) * pageSize.Value).Take(pageSize.Value).ToList(), total = dataSource.Count() }; } else { var result = new GridResultSet { rows = dataSource.ToList() }; result.total = result.rows.Count; return result; } } public static IGridResultSet ToGridResultSet(this IOrderedQueryable dataSource, int? pageIndex = null, int? pageSize = null) { if (pageIndex.HasValue && pageSize.HasValue) { return new GridResultSet { rows = dataSource.Skip((pageIndex.Value - 1) * pageSize.Value).Take(pageSize.Value).ToList(), //rows = dataSource.Select((x, i) => new { RowNumber = i, Data = x }) // .Where(x => x.RowNumber > pageIndex.Value * pageSize.Value).Take(pageSize.Value).Select(x => x.Data).ToList(), total = dataSource.Count() }; } else { var result = new GridResultSet { rows = dataSource.ToList() }; result.total = result.rows.Count; return result; } } public static IGridResultSet ToGridResultSet(this IQueryable dataSource, Func, IOrderedQueryable> orderByAction, int? pageIndex = null, int? pageSize = null) { if (pageIndex.HasValue && pageSize.HasValue) { return new GridResultSet { rows = orderByAction.Invoke(orderByAction.Invoke(dataSource).Skip((pageIndex.Value - 1) * pageSize.Value).Take(pageSize.Value)).ToList(), //rows = dataSource.Select((x, i) => new { RowNumber = i, Data = x }) // .Where(x => x.RowNumber > pageIndex.Value * pageSize.Value).Take(pageSize.Value).Select(x => x.Data).ToList(), total = dataSource.Count() }; } else { var result = new GridResultSet { rows = dataSource.ToList() }; result.total = result.rows.Count; return result; } } public static List GridResultSetJoin(this IQueryable dataSource, Func, IOrderedQueryable> orderByAction, IQueryable innerQueryable, Expression> innerKeySelector, Expression> outerKeySelector, Expression> resultSelector, int? pageIndex = null, int? pageSize = null) { if (pageIndex.HasValue && pageSize.HasValue) { return orderByAction.Invoke(orderByAction.Invoke(dataSource).Skip((pageIndex.Value - 1) * pageSize.Value).Take(pageSize.Value)) .Join(innerQueryable, innerKeySelector, outerKeySelector, resultSelector).ToList(); } else { return dataSource.Join(innerQueryable, innerKeySelector, outerKeySelector, resultSelector).ToList(); } } public static IGridResultSet ToJsonResultSet(this IOrderedQueryable dataSource, int? pageIndex = null, int? pageSize = null) { var resultSet = ToGridResultSet(dataSource, pageIndex, pageSize); return new GridResultSet { rows = resultSet.rows.Select(x => JObject.FromObject(x)).ToList(), total = resultSet.total }; } public static IQueryable DynamicWhere(this IQueryable dataSource, string propertyName, string comparer, object value) { ExpressionFactory factory = new ExpressionFactory(dataSource); return dataSource.Where(factory.DynamicExpression(propertyName, comparer, value)); } public static IQueryable DynamicInWhere(this IQueryable dataSource, string propertyName, IList value) { ExpressionFactory factory = new ExpressionFactory(dataSource); return dataSource.Where(factory.DynamicInExpression(propertyName, value)); } public static IQueryable OrderBy(this IQueryable source, string propertyName, bool ascending) where T : class { Type type = typeof(T); PropertyInfo property = type.GetProperty(propertyName); if (property == null) throw new ArgumentException("propertyName", "Not Exist"); ParameterExpression param = Expression.Parameter(type, "p"); Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property); LambdaExpression orderByExpression = Expression.Lambda(propertyAccessExpression, param); string methodName = ascending ? "OrderBy" : "OrderByDescending"; MethodCallExpression exp = Expression.Call( typeof(Queryable) , methodName , new Type[] { type, property.PropertyType } , source.Expression , Expression.Quote(orderByExpression)); return source.Provider.CreateQuery(exp); } public static IQueryable ThenBy(this IQueryable source, string propertyName, bool ascending) where T : class { Type type = typeof(T); PropertyInfo property = type.GetProperty(propertyName); if (property == null) throw new ArgumentException("propertyName", "Not Exist"); ParameterExpression param = Expression.Parameter(type, "p"); Expression propertyAccessExpression = Expression.MakeMemberAccess(param, property); LambdaExpression orderByExpression = Expression.Lambda(propertyAccessExpression, param); string methodName = ascending ? "ThenBy" : "ThenByDescending"; MethodCallExpression exp = Expression.Call( typeof(Queryable) , methodName , new Type[] { type, property.PropertyType } , source.Expression , Expression.Quote(orderByExpression)); return source.Provider.CreateQuery(exp); } /// /// 将集合类转换成DataTable /// /// 集合 /// public static DataTable ToDataTable(this List list) { DataTable result = new DataTable(); if (list.Count > 0) { PropertyInfo[] propertys = list[0].GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { result.Columns.Add(pi.Name, pi.PropertyType); } for (int i = 0; i < list.Count; i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in propertys) { object obj = pi.GetValue(list[i], null); tempList.Add(obj); } object[] array = tempList.ToArray(); result.LoadDataRow(array, true); } } return result; } } }