internal override sealed string ConstructClassViewString(ClassViewAttribute cva, ConnectionPool pool, QueryBuilder builder, ref List<IDbDataParameter> queryParameters, ref int parCount) { string ret = FieldName+" "; if (FieldValue == null) { ret += ComparatorString + " " + builder.CreateParameterName("parameter_" + parCount.ToString()); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue)); parCount++; } else if (FieldValue.GetType().IsArray || (FieldValue is ICollection)) { if (SupportsList) { ret += " " + ComparatorString + " ( "; foreach (object obj in (IEnumerable)FieldValue) { ret += builder.CreateParameterName("parameter_" + parCount.ToString()) + ","; if (cva.Query.IsEnumField(FieldName)) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(obj.GetType(), obj.ToString()))); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), obj)); parCount++; } ret = ret.Substring(0, ret.Length - 1); ret += " )"; } else { string tmp = ret + " " + ComparatorString+" "; ret = "("; foreach (object obj in (IEnumerable)FieldValue) { ret += tmp+builder.CreateParameterName("parameter_" + parCount.ToString()) + " OR "; if (cva.Query.IsEnumField(FieldName)) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(obj.GetType(), obj.ToString()))); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), obj)); parCount++; } ret = ret.Substring(0, ret.Length - 3); ret += ")"; } } else { ret += ComparatorString + " "; ret += builder.CreateParameterName("parameter_" + parCount.ToString()); if (cva.Query.IsEnumField(FieldName)) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(FieldValue.GetType(), FieldValue.ToString()))); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue)); parCount++; } return ret; }
internal sealed override string ConstructString(Type tableType, ConnectionPool pool, QueryBuilder builder, ref List<IDbDataParameter> queryParameters, ref int parCount) { bool found = false; string ret = ""; FieldType? type=null; Type _objType = null; int fieldLength = 0; bool isExternal = false; bool isClassBased=false; Type newType; Type linkedType; string alias = ""; string fldName = LocateTableField(FieldName,tableType, out isClassBased, out isExternal,out newType,out alias,out linkedType); found = fldName != null; if ((alias != null) && (alias.Length > 0)) alias = "main_table_" + alias + "."; if (isExternal) { if (found) { if ((alias == "")||(alias==null)) alias = "main_table."; sTable relatedMap = pool.Mapping[newType]; if (isClassBased) { sTable map = pool.Mapping[linkedType]; if (FieldValue != null) { foreach (string prop in relatedMap.PrimaryKeyProperties) { foreach (sTableField fld in relatedMap[prop]) { foreach (sTableField f in map[fldName]) { if (f.ExternalField == fld.Name) { ret += " AND " + (this.CaseInsensitive ? "UPPER(" : "") + alias + f.Name + (this.CaseInsensitive ? ")" : "") + " " + ComparatorString + " " + builder.CreateParameterName("parameter_" + parCount.ToString()); object val = QueryBuilder.LocateFieldValue((Org.Reddragonit.Dbpro.Structure.Table)FieldValue, fld, pool); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), val, f.Type, f.Length)); parCount++; break; } } } } } else { foreach (sTableField f in map[fldName]) { ret += " AND " + (this.CaseInsensitive ? "UPPER(" : "") + alias + f.Name + (this.CaseInsensitive ? ")" : "") + " " + ComparatorString + " " + builder.CreateParameterName("parameter_" + parCount.ToString()); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), null, f.Type, f.Length)); parCount++; } } } else { foreach (string prop in relatedMap.PrimaryKeyProperties) { sTableField[] flds = relatedMap[prop]; if (flds[0].ExternalField != null) { Org.Reddragonit.Dbpro.Structure.Table tbl = null; if (FieldValue != null) tbl = (Org.Reddragonit.Dbpro.Structure.Table)QueryBuilder.LocateFieldValue((Org.Reddragonit.Dbpro.Structure.Table)FieldValue, flds[0], pool); if (tbl != null) { sTable relMap = pool.Mapping[tbl.GetType()]; foreach (sTableField fld in relMap.Fields) { foreach (sTableField f in flds) { if (fld.Name == f.ExternalField) { ret += " AND " + (this.CaseInsensitive ? "UPPER(" : "") + alias + flds[0].Name + (this.CaseInsensitive ? ")" : "") + " " + ComparatorString + " " + builder.CreateParameterName("parameter_" + parCount.ToString()); object val = QueryBuilder.LocateFieldValue(tbl, fld, pool); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), val, fld.Type, fld.Length)); parCount++; break; } } } } else { foreach (sTableField fld in flds) { ret += " AND " + (this.CaseInsensitive ? "UPPER(" : "") + alias + flds[0].Name + (this.CaseInsensitive ? ")" : "") + " " + ComparatorString + " " + builder.CreateParameterName("parameter_" + parCount.ToString()); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), null, fld.Type, fld.Length)); parCount++; } } } else { type = flds[0].Type; fieldLength = flds[0].Length; ret += " AND " + (this.CaseInsensitive ? "UPPER(" : "") + alias + flds[0].Name + (this.CaseInsensitive ? ")" : "") + " " + ComparatorString + " " + builder.CreateParameterName("parameter_" + parCount.ToString()); if (type == FieldType.ENUM) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(newType.GetProperty(prop, Utility._BINDING_FLAGS).PropertyType, ((Org.Reddragonit.Dbpro.Structure.Table)FieldValue).GetField(prop).ToString()))); else if (FieldValue == null) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), null, type.Value, fieldLength)); else { object val = ((Org.Reddragonit.Dbpro.Structure.Table)FieldValue).GetField(prop); if (val == null) val = QueryBuilder.LocateFieldValue((Org.Reddragonit.Dbpro.Structure.Table)FieldValue, flds[0], pool); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), val, type.Value, fieldLength)); } parCount++; } } } ret = ret.Substring(4); }else throw new Exception("Unable to handler external fields without specifying class name."); } else { if ((alias == "") || (alias == null)) alias = "main_table."; if (fldName != null) { ret = (this.CaseInsensitive ? "UPPER(" : "") + alias + fldName + " " + (this.CaseInsensitive ? ")" : ""); foreach (sTableField fld in pool.Mapping[newType].Fields) { if (fld.Name == fldName) { type = fld.Type; fieldLength = fld.Length; break; } } } if (!found) ret = FieldName + " "; if (SupportsList) { ret += ComparatorString + " ("; if (FieldValue.GetType().IsArray || (FieldValue is IEnumerable)) { foreach (object obj in (IEnumerable)FieldValue) { if (_objType == null) _objType = obj.GetType(); ret += builder.CreateParameterName("parameter_" + parCount.ToString()) + ","; if ((_objType != null) && Utility.IsEnum(_objType)) { queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(_objType, obj.ToString()))); } else { if (type.HasValue) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), obj, type.Value, fieldLength)); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), obj)); } parCount++; } ret = ret.Substring(0, ret.Length - 1); } else { ret += builder.CreateParameterName("parameter_" + parCount.ToString()); if (_objType == null) _objType = FieldValue.GetType(); if ((_objType != null) && Utility.IsEnum(_objType)) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(_objType, FieldValue.ToString()))); else { if (type.HasValue) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue, type.Value, fieldLength)); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue)); } parCount++; } ret += ")"; } else { if (FieldValue == null) { ret += ComparatorString +" "+ builder.CreateParameterName("parameter_" + parCount.ToString()); queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue)); parCount++; } else if (FieldValue.GetType().IsArray || (FieldValue is ICollection)) { string tmp = ret; tmp += ComparatorString+ " "; ret += "( "; foreach (object obj in (IEnumerable)FieldValue) { if (_objType == null) _objType = obj.GetType(); ret += tmp + builder.CreateParameterName("parameter_" + parCount.ToString()) + " AND "; if ((_objType != null) && Utility.IsEnum(_objType)) { queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(_objType, obj.ToString()))); } else { if (type.HasValue) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), obj, type.Value, fieldLength)); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), obj)); } parCount++; } ret = ret.Substring(0, tmp.Length - 4); ret += " )"; } else { ret += ComparatorString+" "; ret += builder.CreateParameterName("parameter_" + parCount.ToString()); if (_objType == null) _objType = FieldValue.GetType(); if ((_objType != null) && Utility.IsEnum(_objType)) { queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), pool.GetEnumID(_objType, FieldValue.ToString()))); } else { if (type.HasValue) queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue, type.Value, fieldLength)); else queryParameters.Add(pool.CreateParameter(builder.CreateParameterName("parameter_" + parCount.ToString()), FieldValue)); } parCount++; } } } return ret; }