zoukankan      html  css  js  c++  java
  • 记录一次使用 Expression 的方法

         /// <summary>
            /// 实现 Name == "a" or Name == "b" or Name == "c"
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="query"></param>
            /// <param name="condition"></param>
            /// <param name="selector"></param>
            /// <param name="values"></param>
            /// <returns></returns>
            public static IQueryable<T> WhereIfEqOr<T, TResult>(this IQueryable<T> query, bool condition, Expression<Func<T, TResult>> selector, List<TResult> values)
            {
                if (condition == false) return query;
                if (values != null && values.Count > 0)
                {
                    Type type = typeof(T);
                    ParameterExpression paramExp = Expression.Parameter(type, "x");
                    var memberExp = selector.Body as MemberExpression;
                    Expression propertyExp = Expression.Property(paramExp, memberExp.Member.Name);
                    Expression expression = Expression.Equal(propertyExp, Expression.Constant(values[0], typeof(TResult)));
                    for (int i = 1; i < values.Count; i++)
                    {
                        expression = Expression.Or(expression, Expression.Equal(propertyExp, Expression.Constant(values[i], typeof(TResult))));
                    }
                    var lambda = Expression.Lambda<Func<T, bool>>(expression, paramExp);
                    query = query.Where(lambda);
                }
                return query;
            }
         /// <summary>
            /// 实现 Name like "%a%" or Name like "%b%" or Name like "%c%"
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="query"></param>
            /// <param name="condition"></param>
            /// <param name="selector"></param>
            /// <param name="values"></param>
            /// <returns></returns>
            public static IQueryable<T> WhereIfContainsOr<T, TResult>(this IQueryable<T> query, bool condition, Expression<Func<T, TResult>> selector, List<TResult> values)
            {
                if (condition == false) return query;
                if (values != null && values.Count > 0)
                {
                    Type type = typeof(T);
                    ParameterExpression paramExp = Expression.Parameter(type, "x");
                    var memberExp = selector.Body as MemberExpression;
                    Expression propertyExp = Expression.Property(paramExp, memberExp.Member.Name);
                    Expression expression = Expression.Call(propertyExp, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), Expression.Constant(values[0], typeof(TResult)));
                    for (int i = 1; i < values.Count; i++)
                    {
                        expression = Expression.Or(expression, Expression.Call(propertyExp, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), Expression.Constant(values[i], typeof(TResult))));
                    }
                    var lambda = Expression.Lambda<Func<T, bool>>(expression, paramExp);
                    query = query.Where(lambda);
                }
                return query;
            }

    这两种方法可以使用一个字段的或关系

  • 相关阅读:
    php 随机红包算法
    mysql window系统备份远程数据库到本地
    程序员 面试题【前端,java,php】
    PDMan 数据库建模工具
    数据结构之更多字符串的内容
    数据结构之参考-对象与参考
    数据结构之序列
    excel的宏与VBA入门——代码调试
    DataWorks使用小结(二)——功能面板使用指南
    DataWorks使用小结(一)——概述
  • 原文地址:https://www.cnblogs.com/dazen/p/13267563.html
Copyright © 2011-2022 走看看