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

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

  • 相关阅读:
    定点数的表示
    [收集]XMPP使用tls 和sasl登录
    socket函数
    [收集] SendMessage、PostMessage原理
    DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。
    关于在IWebBrowser中无法响应Ctrl+C等快捷键的解决方法
    Enum 操作
    程序员面对分歧和难题应当具备的态度【转】
    NDIS学习笔记一
    NDIS学习笔记二——(模拟丢包)
  • 原文地址:https://www.cnblogs.com/dazen/p/13267563.html
Copyright © 2011-2022 走看看