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