Linq To Entity 查询条件扩展
2013-01-08 16:53
471 查看
/// <summary> /// 统一ParameterExpression /// </summary> internal class ParameterReplacer : ExpressionVisitor { public ParameterReplacer(ParameterExpression paramExpr) { ParameterExpression = paramExpr; } public ParameterExpression ParameterExpression { get; private set; } public Expression Replace(Expression expr) { return Visit(expr); } protected override Expression VisitParameter(ParameterExpression p) { return ParameterExpression; } } /// <summary> /// Predicate扩展 /// </summary> public static class PredicateExtensionses { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expression<Func<T, bool>> True<T>() { return f => true; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static Expression<Func<T, bool>> False<T>() { return f => false; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expLeft"></param> /// <param name="expRight"></param> /// <returns></returns> public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expLeft, Expression<Func<T, bool>> expRight) { var candidateExpr = Expression.Parameter(typeof(T), "candidate"); var parameterReplacer = new ParameterReplacer(candidateExpr); var left = parameterReplacer.Replace(expLeft.Body); var right = parameterReplacer.Replace(expRight.Body); var body = Expression.And(left, right); return Expression.Lambda<Func<T, bool>>(body, candidateExpr); } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expLeft"></param> /// <param name="expRight"></param> /// <returns></returns> public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expLeft, Expression<Func<T, bool>> expRight) { var candidateExpr = Expression.Parameter(typeof(T), "candidate"); var parameterReplacer = new ParameterReplacer(candidateExpr); var left = parameterReplacer.Replace(expLeft.Body); var right = parameterReplacer.Replace(expRight.Body); var body = Expression.Or(left, right); return Expression.Lambda<Func<T, bool>>(body, candidateExpr); } } /// <summary> /// Queryable扩展 /// </summary> public static class QueryableExtensions { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="queryable"></param> /// <param name="propertyName"></param> /// <returns></returns> public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName) { return OrderBy(queryable, propertyName, false); } /// <summary> /// OrderBy /// </summary> /// <typeparam name="T">实体</typeparam> /// <param name="queryable">条件</param> /// <param name="propertyName">属性名称</param> /// <param name="desc">是否降序</param> /// <returns></returns> public static IQueryable<T> OrderBy<T>(this IQueryable<T> queryable, string propertyName, bool desc) { var param = Expression.Parameter(typeof(T)); var body = Expression.Property(param, propertyName); dynamic keySelector = Expression.Lambda(body, param); return desc ? Queryable.OrderByDescending(queryable, keySelector) : Queryable.OrderBy(queryable, keySelector); } }
相关文章推荐
- Linq To Entity 查询条件扩展
- 【整理】Linq to Entity 动态拼接查询条件(重点是OR)
- Linq to Entity 动态拼接查询条件(重点是OR)
- linq to ef 动态查询条件
- linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)
- Entity framewrok (linq to entity)查询优化的一点摸索
- linq 动态拼接查询条件 扩展方法
- 今天想到 Linq to sql 好像没法做可变条件的查询
- Linq to SQL实现链接加条件查询
- Linq与where实现查询(Linq to Entity)【IEnumerable与IEnumerator与IList】|自己实现foreach的功能
- 今天想到 Linq to sql 好像没法做可变条件的查询
- linq to sql的多条件动态查询
- linq to entity(两个entity的连接查询)
- Linq中的多条件查询扩展
- LINQ to SQL 运行时动态构建查询条件
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
- linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)
- linq to sql的多条件动态查询
- 使用Python读取TestTrack记录- Part3 动态生成Linq to xml查询语句筛选条件
- Linq to sql 实现多条件的动态查询(方法一)