/// <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())); }