private string TranslateIClause(IClause clause, DbCommand oCmd, ref int k) { String cmdText = ""; if (clause is SingleClause) { SingleClause sc = clause as SingleClause; if (sc.Operator == CriteriaOperator.IsNull || sc.Operator == CriteriaOperator.IsNotNull) { cmdText += String.Format("({0} {1})", sc.PropertyName, DaoSQLServerDBHelper.TranslateOperator(sc.Operator)); } else { string par = String.Format("p{0}", k++); cmdText += String.Format("({0} {1} :{2})", sc.PropertyName, DaoSQLServerDBHelper.TranslateOperator(sc.Operator), par); try { ObjectParameter p = new ObjectParameter(par, ((SingleClause)clause).Value.ToString()); //oCmd.Parameters.Add(par, ((SingleClause)clause).Value.ToString()); } catch { } } } else if (clause is CombinedClause) { cmdText += "("; CombinedClause cc = clause as CombinedClause; for (int j = 0; j < cc.SubClauses.Count() - 1; j++) { cmdText += String.Format("{0} {1} ", TranslateIClause(cc.SubClauses.ElementAt(j), oCmd, ref k), cc.ClauseType.ToString().ToUpper()); } cmdText += String.Format("{0})", TranslateIClause(cc.SubClauses.Last(), oCmd, ref k)); } return(cmdText); }
private QueryCmp BuildQueryByData(ContactsApplicationMapping contact) { QueryCmp q = new QueryCmp(); //prendo tutte le properties mappate su database IEnumerable <PropertyInfo> pi = contact.GetType() .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public) .Where(x => (x.GetCustomAttributes(typeof(DatabaseFieldAttribute), true) != null && x.GetCustomAttributes(typeof(DatabaseFieldAttribute), true).Length > 0)); if (pi.All(x => { Type pt = x.PropertyType; if (pt.IsValueType) { return(x.GetValue(contact, null).Equals(Activator.CreateInstance(pt))); } else { return(x.GetValue(contact, null) == null); } })) { return(q); } var validProps = pi.Where(x => { Type pt = x.PropertyType; if (pt.IsValueType) { return(!x.GetValue(contact, null).Equals(Activator.CreateInstance(pt))); } else { return(x.GetValue(contact, null) != null); } }); CombinedClause cc = new CombinedClause(); q.WhereClause = cc; List <IClause> lc = new List <IClause>(); cc.SubClauses = lc; if (validProps.Count() == 1) { cc.ClauseType = QueryOperator.Or; lc.Add(BuildSingleClause(contact, validProps.Single())); lc.Add(BuildNullClause(validProps.Single())); } else { cc.ClauseType = QueryOperator.And; foreach (var p in validProps) { CombinedClause cc0 = new CombinedClause(); cc0.ClauseType = QueryOperator.Or; List <IClause> lc0 = new List <IClause>(); cc0.SubClauses = lc0; lc0.Add(BuildSingleClause(contact, p)); lc0.Add(BuildNullClause(p)); lc.Add(cc0); } } return(q); }