123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Reflection;
- namespace TEAMModelOS.SDK.Helper.Query.LinqHelper
- {
- public static class DynamicLinq
- {
- /// <summary>
- /// 创建参数表达式
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="name"></param>
- /// <returns></returns>
- public static ParameterExpression CreateLambdaParam<T>(string name)
- {
- return Expression.Parameter(typeof(T), name);
- }
- /// <summary>
- /// 创建linq表达示的body部分
- /// </summary>
- public static Expression GenerateBody<T>(this ParameterExpression param, Filter filterObj)
- {
- PropertyInfo property = typeof(T).GetProperty(filterObj.Key);
- //组装左边
- Expression left = Expression.Property(param, property);
- //组装右边
- Expression right = null;
- if (property.PropertyType == typeof(int))
- {
- right = Expression.Constant(int.Parse(filterObj.Value));
- }
- else if (property.PropertyType == typeof(DateTime))
- {
- right = Expression.Constant(DateTime.Parse(filterObj.Value));
- }
- else if (property.PropertyType == typeof(string))
- {
- right = Expression.Constant((filterObj.Value));
- }
- else if (property.PropertyType == typeof(decimal))
- {
- right = Expression.Constant(decimal.Parse(filterObj.Value));
- }
- else if (property.PropertyType == typeof(Guid))
- {
- right = Expression.Constant(Guid.Parse(filterObj.Value));
- }
- else if (property.PropertyType == typeof(bool))
- {
- right = Expression.Constant(filterObj.Value.Equals("1"));
- }
- else if (property.PropertyType == typeof(Guid?))
- {
- left = Expression.Property(left, "Value");
- right = Expression.Constant(Guid.Parse(filterObj.Value));
- }
- else
- {
- throw new Exception("暂不能解析该Key的类型");
- }
- //c.XXX=="XXX"
- Expression filter = Expression.Equal(left, right);
- switch (filterObj.Contrast)
- {
- case "<=":
- filter = Expression.LessThanOrEqual(left, right);
- break;
- case "<":
- filter = Expression.LessThan(left, right);
- break;
- case ">":
- filter = Expression.GreaterThan(left, right);
- break;
- case ">=":
- filter = Expression.GreaterThanOrEqual(left, right);
- break;
- case "!=":
- filter = Expression.NotEqual(left, right);
- break;
- case "like":
- filter = Expression.Call(left, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }),
- Expression.Constant(filterObj.Value));
- break;
- case "not in":
- var listExpression = Expression.Constant(filterObj.Value.Split(',').ToList()); //数组
- var method = typeof(List<string>).GetMethod("Contains", new Type[] { typeof(string) }); //Contains语句
- filter = Expression.Not(Expression.Call(listExpression, method, left));
- break;
- case "in":
- var lExp = Expression.Constant(filterObj.Value.Split(',').ToList()); //数组
- var methodInfo = typeof(List<string>).GetMethod("Contains", new Type[] { typeof(string) }); //Contains语句
- filter = Expression.Call(lExp, methodInfo, left);
- break;
- }
- return filter;
- }
- public static Expression<Func<T, bool>> GenerateTypeBody<T>(this ParameterExpression param, Filter filterObj)
- {
- return (Expression<Func<T, bool>>)(param.GenerateBody<T>(filterObj));
- }
- /// <summary>
- /// 创建完整的lambda
- /// </summary>
- public static LambdaExpression GenerateLambda(this ParameterExpression param, Expression body)
- {
- //c=>c.XXX=="XXX"
- return Expression.Lambda(body, param);
- }
- public static Expression<Func<T, bool>> GenerateTypeLambda<T>(this ParameterExpression param, Expression body)
- {
- return (Expression<Func<T, bool>>)(param.GenerateLambda(body));
- }
- public static Expression AndAlso(this Expression expression, Expression expressionRight)
- {
- return Expression.AndAlso(expression, expressionRight);
- }
- public static Expression Or(this Expression expression, Expression expressionRight)
- {
- return Expression.Or(expression, expressionRight);
- }
- public static Expression And(this Expression expression, Expression expressionRight)
- {
- return Expression.And(expression, expressionRight);
- }
- public static IQueryable<T> Where<T>(this IQueryable<T> query, Expression expression)
- {
- Expression expr = Expression.Call(typeof(Queryable), "Where", new[] { typeof(T) },
- Expression.Constant(query), expression);
- //生成动态查询
- IQueryable<T> result = query.Provider.CreateQuery<T>(expr);
- return result;
- }
- public static IQueryable<T> GenerateFilter<T>(this IQueryable<T> query, IEnumerable<Filter> filters)
- {
- if (filters != null)
- {
- // var filters = JsonHelper.Instance.Deserialize<IEnumerable<Filter>>(filterjson);
- var param = CreateLambdaParam<T>("c");
- //条件为ture
- Expression result = Expression.Constant(true);
- foreach (var filter in filters)
- {
- result = result.AndAlso(param.GenerateBody<T>(filter));
- }
- query = query.Where(param.GenerateTypeLambda<T>(result));
- }
- return query;
- }
- }
- }
|