示例#1
0
        /// <summary>
        /// Extendable method: 过滤数据源中属性包含(或不包含)某些值的实体(生成Sql IN表达式)
        /// </summary>
        /// <typeparam name="TModel">视图对象类型</typeparam>
        /// <typeparam name="TProperty">对象属性类型</typeparam>
        /// <param name="source">视图查询数据源</param>
        /// <param name="selector">指定对象某属性的表达式</param>
        /// <param name="values">对象属性所包含的值</param>
        /// <param name="isIn">IN 或 NOT IN</param>
        /// <returns>新的视图查询数据源</returns>
        public static IDbView <TModel> In <TModel, TProperty>(this IDbView <TModel> source, Expression <Func <TModel, TProperty> > selector, TProperty[] values, bool isIn = true)
            where TModel : class, new()
        {
            //非空验证
            Check.ArgumentNull(source, nameof(source));
            Check.ArgumentNull(selector, nameof(selector));
            Check.ArgumentNull(values, nameof(values));
            //获取sql表达式模板
            MemberExpression memberExpression = selector.Body.GetMemberExpression();
            StringBuilder    sqlTemplate      = new StringBuilder();

            sqlTemplate.AppendLine(isIn ? "IN " : "NOT IN ");
            for (int i = 0; i < values.Length; i++)
            {
                sqlTemplate.AppendFormat("\t {0}", i == 0 ? '(' : ' ');
                sqlTemplate.AppendFormat("${0}", memberExpression.Member.Name);
                sqlTemplate.AppendFormat("{0}{1}", i, (i + 1 == values.Length) ? ")" : ",\n");
            }
            //获取原始参数集合
            IDbDataParameter[] parameters = new IDbDataParameter[values.Length];
            for (int i = 0; i < values.Length; i++)
            {
                parameters[i] = source.ParameterFactory.Parameter(string.Concat(memberExpression.Member.Name, i), values[i]);
            }
            //过滤获取新数据源
            return(source.Factory.CreateView(source, memberExpression, sqlTemplate.ToString(), parameters.ToArray()));
        }