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;
}
}
}