public void Test_MultiThreadingLookup2()
        {
            var instance = new PublicPropertiesModel();


            for (var i2 = 0; i2 < 1000; i2++)
            {
                var threads = new Thread[4];

                for (var i = 0; i < threads.Length; i++)
                {
                    threads[i] = new Thread(delegate(object sdo)
                    {
                        ExtFastMember.GetMemberWrappers <PublicPropertiesModel>(true);
                        ExtFastMember.GetMemberWrappers(typeof(PublicPropertiesModel), true);
                    });
                }

                foreach (var thread in threads)
                {
                    thread.Start();
                }

                foreach (var thread in threads)
                {
                    thread.Join();
                }
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="row"></param>
        /// <param name="useAttributeName">if true when mapping datarow columns to T instance. Attribute mapto name will be used instead of property name if exist</param>
        /// <returns></returns>
        public static T MapTo <T>(this DataRow row, bool useAttributeName = true) where T : class
        {
            var obj = New <T> .Instance();

            if (typeof(T).IsTypeDynamic())
            {
                dynamic expandoObject = new ExpandoObject();
                foreach (DataColumn column in row.Table.Columns)
                {
                    var value = row[column];
                    ExtFastMember.SetMemberValue(expandoObject, column.ColumnName, value == DBNull.Value ? null : value);
                }
                return(expandoObject);
            }
            ExtFastMember.GetMemberWrappers <T>(true).ForEach(delegate(MemberWrapper wrapper)
            {
                var columnName = useAttributeName ? wrapper.GetNameFromCustomAttributeOrDefault() : wrapper.Name;
                if (row.Table.Columns.Contains(columnName))
                {
                    var value = row[columnName];
                    if (value == DBNull.Value)
                    {
                        value = null;
                    }
                    try
                    {
                        ExtFastMember.SetMemberValue(obj, wrapper.Name, value);
                    }
                    catch (InvalidOperationException) { }                     // These are properties or field without a setter
                    catch (ArgumentOutOfRangeException) { }
                }
            });
            return(obj);
        }
        public void Test_GettingMemberValueFromObject()
        {
            var obj = new PublicPropertiesNoAccessor()
            {
                FalseNullableBoolean = false
                ,
                IsPublicProperty = true
                ,
                NullBoolean = null
            };
            var members = ExtFastMember.GetMemberWrappers <PublicPropertiesNoAccessor>(true);

            foreach (var member in members)
            {
                if (member.Name == "FalseNullableBoolean")
                {
                    Assert.AreEqual(member.GetValue(obj), false);
                }
                if (member.Name == "IsPublicProperty")
                {
                    Assert.AreEqual(member.GetValue(obj), true);
                }
                if (member.Name == "NullBoolean")
                {
                    Assert.AreEqual(member.GetValue(obj), null);
                }
            }
        }
        /// <summary>
        /// Gets all non ignore fields.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns>List&lt;AdvanceMember&gt;.</returns>
        public List <AdvanceMember> GetAllNonIgnoreFields <T>() where T : class
        {
            // Get the primary key fields - The properties in the class decorated with PrimaryKey attribute.
            var temp = ExtFastMember.GetAdvanceMembers <T>().Where(m => m.SqlCustomAttritube.Ignore != true && m.SqlTableAttritube == null).ToList();

            return(temp);
        }
        /// <summary>
        /// Builds the update query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlBuilder">The SQL builder.</param>
        /// <param name="tableName">Name of the table.</param>
        /// <param name="poco">The poco.</param>
        public void BuildUpdateQuery <T>(StringBuilder sqlBuilder, string tableName, T poco, Expression <Func <T, object> > overrideKeys) where T : class
        {
            var keyFields = new List <AdvanceMember>()
            {
            };

            if (overrideKeys != null)
            {
                var outputFields = overrideKeys.GetPropertyNamesFromExpression();
                //     keyFields = ExtFastMember.GetAdvanceMembers<T>().Where(m => outputFields.Contains(m.FastMember.Name,new EqualityComparerString(StringComparison.OrdinalIgnoreCase))).ToList();
                keyFields = ExtFastMember.GetAdvanceMembers <T>().Where(m => outputFields.Contains(m.FastMember.Name)).ToList();
            }
            else
            {
                keyFields = GetKeyFields <T>(poco);
            }

            //  var keyFields = GetKeyFields<T>(poco);
            var updateFields = GetNonIdentityFields <T>(poco);

            // Build Update Statement Prefix
            sqlBuilder.Append($"UPDATE {tableName} SET ");

            // Build Set fields
            updateFields.ForEach(p => sqlBuilder.Append($"[{p.GetActualMemberName()}]=@{p.Member.Name},"));
            sqlBuilder.Remove(sqlBuilder.Length - 1, 1); // Remove the last comma

            // Build Where clause.
            sqlBuilder.Append(" ");
            BuildWhereClause(sqlBuilder, keyFields, overrideKeys == null);
        }
Ejemplo n.º 6
0
        public static bool IsSqlColumnsKeysMatchingValues <T>(T poco1, T poco2) where T : class
        {
            var k1       = ExtFastMember.GetAdvanceMembers(poco1);
            var k2       = ExtFastMember.GetAdvanceMembers(poco2);
            var keys1    = k1.Where(member => member.SqlCustomAttritube.PrimaryKey == true);
            var keys2    = k2.Where(member => member.SqlCustomAttritube.PrimaryKey == true);
            var i        = 0;
            var passTest = true;

            keys1.ToList().ForEach(delegate(AdvanceMember s)  // KEY MUST MATCH IN ORDER FOR RECORD TO EXIST
            {
                if (!passTest)
                {
                    return;
                }
                var tempAdvance = keys2.ToList()[i];

                if (s.Value.Equals(tempAdvance.Value))
                {
                    // if(k1.First(a => a.Member.Name == "Name").Value  == )
                }
                else
                {
                    //var test = s.Value.Equals(tempAdvance.Value);
                    passTest = false;
                }
                i++;
            });
            return(passTest);
        }
        /// <summary>
        /// Builds the upsert query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlBuilder">The SQL builder.</param>
        /// <param name="tableName">Name of the table.</param>
        /// <param name="poco">The poco.</param>
        public void BuildUpsertQuery <T>(StringBuilder sqlBuilder, string tableName, T poco, Expression <Func <T, object> > overrideKeys) where T : class
        {
            var keyFields = new List <AdvanceMember>()
            {
            };

            if (overrideKeys != null)
            {
                var outputFields = overrideKeys.GetPropertyNamesFromExpression();
                keyFields = ExtFastMember.GetAdvanceMembers <T>().Where(m => outputFields.Contains(m.FastMember.Name)).ToList();
            }
            else
            {
                keyFields = GetKeyFields <T>(poco);
            }
            //  var keyFields = GetKeyFields<T>(poco);
            // Build If Exists statement
            sqlBuilder.Append($"IF EXISTS ( SELECT * FROM {tableName} ");
            BuildWhereClause(sqlBuilder, keyFields, overrideKeys == null);
            sqlBuilder.Append(" ) BEGIN ");

            // Build Update or Insert statement
            BuildUpdateQuery(sqlBuilder, tableName, poco, overrideKeys);
            sqlBuilder.Append(" END ELSE BEGIN ");
            BuildInsertQuery(sqlBuilder, tableName, poco, overrideKeys);
            sqlBuilder.Append(" END");
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Gets all non ignore fields.
        /// </summary>
        /// <returns>List&lt;MemberWrapper&gt;.</returns>
        public List <MemberWrapper> GetAllNonIgnoreFields(Type type, bool includeNonPublicAccessor)
        {
            // Get the primary key fields - The properties in the class decorated with PrimaryKey attribute.
            var temp = ExtFastMember.GetMemberWrappers(type, includeNonPublicAccessor).Where(m => !m.ShouldMemberBeIgnored()).AsList();

            return(temp);
        }
        public void Test_AccessingPrivateMembers()
        {
            // FAST-MEMBER DOESN'T SUPPORT ACCESSING NON-PUBLIC PROPERTIES
            var members = ExtFastMember.GetMemberWrappers <PrivatePropertiesModel>(true);

            Assert.AreEqual(0, members.Count);
        }
        public void Test_Setting_String_Value_To_Other_Types()
        {
            var obj = new StringValueModel()
            {
            };
            var members = ExtFastMember.GetMemberWrappers <StringValueModel>(true);


            foreach (var member in members)
            {
                if (member.Name == "DateTimeOffset")
                {
                    member.SetMemberValue(obj, "2017-05-30");
                    Assert.AreEqual(member.GetValue(obj), DateTimeOffset.Parse("2017-05-30"));
                }
                if (member.Name == "Guid")
                {
                    member.SetMemberValue(obj, "a19ed8e6-c455-4164-afac-d4043095a4ee");
                    Assert.AreEqual(member.GetValue(obj), Guid.Parse("a19ed8e6-c455-4164-afac-d4043095a4ee"));
                }
                if (member.Name == "TimeSpan")
                {
                    member.SetMemberValue(obj, "01:00:00");
                    Assert.AreEqual(member.GetValue(obj), TimeSpan.Parse("01:00:00"));
                }
            }
        }
        public void Test_Set_Member_Value_From_Dynamic_Object_Level_With_Property_Not_Existing()
        {
            dynamic obj = new ExpandoObject();

            ExtFastMember.SetMemberValue(obj, "FalseNullableBoolean", null);
            ExtFastMember.SetMemberValue(obj, "IsPublicProperty", false);
            ExtFastMember.SetMemberValue(obj, "NullBoolean", true);
            var members = ExtFastMember.GetMemberWrappers(obj);

            foreach (MemberWrapper member in members)
            {
                if (member.Name == "FalseNullableBoolean")
                {
                    Assert.AreEqual(member.GetValue(obj), null);
                }
                if (member.Name == "IsPublicProperty")
                {
                    Assert.AreEqual(member.GetValue(obj), false);
                }
                if (member.Name == "NullBoolean")
                {
                    Assert.AreEqual(member.GetValue(obj), true);
                }
            }
        }
        public void Test_Set_Member_Value_From_Dynamic_Member_Level()
        {
            dynamic obj = new ExpandoObject();

            obj.FalseNullableBoolean = false;
            obj.IsPublicProperty     = true;
            obj.NullBoolean          = null;
            var members = ExtFastMember.GetMemberWrappers(obj);

            foreach (MemberWrapper member in members)
            {
                if (member.Name == "FalseNullableBoolean")
                {
                    member.SetMemberValue(obj, null);
                    Assert.AreEqual(member.GetValue(obj), null);
                }
                if (member.Name == "IsPublicProperty")
                {
                    member.SetMemberValue(obj, false);
                    Assert.AreEqual(member.GetValue(obj), false);
                }
                if (member.Name == "NullBoolean")
                {
                    member.SetMemberValue(obj, true);
                    Assert.AreEqual(member.GetValue(obj), true);
                }
            }
        }
 /// <summary>
 /// Gets the key fields.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <returns>List&lt;AdvanceMember&gt;.</returns>
 public List <AdvanceMember> GetKeyFields(Type type)
 {
     // Get the primary key fields - The properties in the class decorated with PrimaryKey attribute.
     return(ExtFastMember.GetAdvanceMembers(type).Where(m =>
                                                        m.SqlCustomAttritube.PrimaryKey == true && m.SqlCustomAttritube.Ignore != true &&
                                                        m.SqlTableAttritube == null).ToList());
 }
Ejemplo n.º 14
0
        /// <summary>
        /// Builds the upsert query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlBuilder">The SQL builder.</param>
        /// <param name="tableName">Name of the table.</param>
        private void BuildUpsertQuery <T>(StringBuilder sqlBuilder, string tableName, params Expression <Func <T, object> >[] overrideKeys) where T : class
        {
            var outputFields = overrideKeys.GetPropertyNamesFromExpressions();
            var keyFields    = ExtFastMember.GetMemberWrappers <T>(IncludeNonPublicAccessor).Where(m => outputFields.Contains(m.Name)).AsList();

            if (keyFields.IsNullOrEmpty())
            {
                throw new MissingKeyAttributeException(ExceptionHelper.MissingKeyMessage);
            }


            var sb1 = new StringBuilder();

            BuildInsertQuery <T>(sb1, tableName);
            var sb2 = new StringBuilder();

            sb2.Append($"{SqlGenerator.BuildWhereClauseFromMembers(SqlSyntaxHelper, keyFields, !AlwaysCreateParamaterizedSql)}");

            if (DatabaseType == DataBaseType.Sqlite)
            {
                tableName = tableName ?? typeof(T).GetTableNameFromCustomAttributeOrDefault();
                SqLiteBuildUpsertQuery <T>(sqlBuilder, keyFields, tableName, sb2.ToString(), sb1.ToString());
            }
            else if (DatabaseType == DataBaseType.MySql)
            {
                sqlBuilder.Append(sb1);
                MySqlBuildOnDuplicateKeyUpdate(sqlBuilder, typeof(T));
            }
            else
            {
                var sb = new StringBuilder();
                BuildUpdateQuery(sb, tableName, overrideKeys);
                sqlBuilder.Append(SqlSyntaxHelper.BuildIfExistStatement($"{SqlSyntaxHelper.ConstSqlServerSelectTop1} {tableName ?? typeof(T).GetTableNameFromCustomAttributeOrDefault()} {sb2}", sb.ToString(), sb1.ToString()));
            }
        }
        internal Dictionary <Type, char> GetTableAliasRecursive <T>() where T : class
        {
            var currentAlias = 'A';
            var lookup       = new Dictionary <Type, char>()
            {
                { typeof(T), currentAlias }
            };


            void addAlias(AdvanceMember m)
            {
                if (lookup.ContainsKey(m.FastMember.Type))
                {
                }
                else
                {
                    currentAlias = Alphabet.GetNextLetter(currentAlias);
                    lookup.Add(m.FastMember.Type, currentAlias);
                }
            }

            void getTableMembers(Type type)
            {
                ExtFastMember.GetAdvanceMembers(type).Where(m => m.SqlTableAttritube != null).ToList().ForEach(delegate(AdvanceMember m)
                {
                    addAlias(m);
                    getTableMembers(m.FastMember.Type);
                });
            }

            getTableMembers(typeof(T));


            return(lookup);
        }
 public void SetMemberValue <T>(T instanceOfObject, object value)
 {
     if (PropertyInfo != null) // SUPPORT FOR IOS
     {
         PropertyInfo.SetValue(instanceOfObject, value);
     }
     ExtFastMember.SetMemberValue(instanceOfObject, Name, value);
 }
Ejemplo n.º 17
0
 /// <summary>
 /// Gets the non identity fields.
 /// </summary>
 /// <returns>List&lt;MemberWrapper&gt;.</returns>
 public List <MemberWrapper> GetNonIdentityFields(bool includeNonPublicAccessor, Type type, object instance)
 {
     if (instance != null && instance is IDynamicMetaObjectProvider a)
     {
         return(ExtFastMember.GetMemberWrappers(a));
     }
     return(ExtFastMember.GetMemberWrappers(type, includeNonPublicAccessor).Where(m => !m.IsMemberAnIdentityColumn() && !m.ShouldMemberBeIgnored()).AsList());
 }
Ejemplo n.º 18
0
        public static DataTable MapToDataTable <T>(this IEnumerable <T> source, string tableName = null) where T : class
        {
            source.IsNullThrow(nameof(source));
            var dt = new DataTable();

            if (!source.Any())
            {
                if (source is IEnumerable <IDynamicMetaObjectProvider> )
                {
                    return(dt);
                }
            }
            List <MemberWrapper> members;

            if (source is IEnumerable <IDynamicMetaObjectProvider> listOfDynamicObjects)
            {
                members = ExtFastMember.GetMemberWrappers(listOfDynamicObjects.First()).Where(w => !w.IsMemberASerializableColumn() && !w.ShouldMemberBeIgnored()).AsList();
            }
            else
            {
                members = ExtFastMember.GetMemberWrappers <T>(true).Where(w => !w.IsMemberASerializableColumn() && !w.ShouldMemberBeIgnored()).AsList();
            }

            var keyColumns = new List <DataColumn>()
            {
            };

            members.ForEach(delegate(MemberWrapper member)
            {
                //An exception of type 'System.NotSupportedException' occurred in System.Data.dll but was not handled in user code
                // DataSet does not support System.Nullable<>.
                var dc = new DataColumn(member.GetNameFromCustomAttributeOrDefault(), member.Type.IsNullable().underlyingType);                 // datacolumn doesn't support nullable type so use underlying

                if (member.IsMemberAnIdentityColumn())
                {
                    dc.AutoIncrement = true;
                }

                if (member.IsMemberAPrimaryKeyColumn())
                {
                    keyColumns.Add(dc);
                }

                dt.Columns.Add(dc);
            });
            dt.PrimaryKey = keyColumns.ToArray();

            source.AsList().ForEach(delegate(T obj)
            {
                var row = dt.NewRow();
                members.ForEach(w => row[w.GetNameFromCustomAttributeOrDefault()] = w.GetValue(obj) ?? DBNull.Value);
                dt.Rows.Add(row);
            });

            dt.TableName = tableName ?? new SqlTable(DataBaseType.SqlServer, source.First().GetType()).TableName;
            return(dt);
        }
        public void Test_SettingNullablePropertiesValue()
        {
            var obj = new NullableFields();

            ExtFastMember.SetMemberValue(obj, "Decimal", 2);
            ExtFastMember.SetMemberValue(obj, "DateTime", DateTime.Now);
            ExtFastMember.SetMemberValue(obj, "DateTimeOffset", DateTimeOffset.Now);
            ExtFastMember.SetMemberValue(obj, "Object", "dsf");
        }
Ejemplo n.º 20
0
 /// <summary>
 /// Gets all non ignore fields.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <returns>List&lt;MemberWrapper&gt;.</returns>
 public List <MemberWrapper> GetAllNonIgnoreFields <T>(T instance, bool includeNonPublicAccessor) where T : class
 {
     // Get non primary key fields - the ones we want to update.
     if (instance is IDynamicMetaObjectProvider a)
     {
         return(ExtFastMember.GetMemberWrappers(a));
     }
     return(GetAllNonIgnoreFields(instance.GetType(), includeNonPublicAccessor));
 }
        public void Test_AccessingMembersOfDynamicObjects()
        {
            dynamic dyn = new ExpandoObject();

            dyn.PropNumber1 = 1;
            dyn.PropNumber2 = 2;
            var members = ExtFastMember.GetMemberWrappers(dyn);

            Assert.AreEqual(2, members.Count);
        }
        public void Test_Setting_List_Property()
        {
            var list = new List <int>()
            {
                1, 2, 3, 4
            };
            var employee = new Employee();

            ExtFastMember.SetMemberValue(employee, "ListOfNumbers", list);
            Assert.AreEqual(list, employee.ListOfNumbers);
        }
Ejemplo n.º 23
0
        /// <summary>
        /// Reads the current row in the dataReader and map it to  a instance of T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="reader"></param>
        /// <param name="readerFieldLookup">A dictionary that contains the columns definition</param>
        /// <param name="xmlDeserializer">A </param>
        /// <param name="jsonDeserializer"></param>
        /// <param name="csvDeserializer"></param>
        /// <returns></returns>
        private static T DataRecordToT <T>(IDataReader reader, Dictionary <string, int> readerFieldLookup, Func <string, Type, object> xmlDeserializer, Func <string, Type, object> jsonDeserializer, Func <string, Type, object> csvDeserializer) where T : class
        {
            var tType = typeof(T);

            if (tType == typeof(string))
            {
                if (reader.IsDBNull(0))
                {
                    return(null);
                }
                else
                {
                    var value = reader.GetValue(0).ToString();
                    return(value as T);
                }
            }

            if (tType.IsTypeDynamic() || tType == typeof(object))
            {
                var dynamicInstance = new ExpandoObject();
                readerFieldLookup.ForEach(delegate(KeyValuePair <string, int> pair)
                {
                    var value = reader.GetValue(pair.Value);
                    ExtFastMember.SetMemberValue(dynamicInstance, pair.Key, value == DBNull.Value ? null : value);
                });
                return(dynamicInstance as T);
            }
            else
            {
                var newInstance = New <T> .Instance();

                var memberWrappers = ExtFastMember.GetMemberWrappers <T>(true);
                readerFieldLookup.ForEach(delegate(KeyValuePair <string, int> pair)
                {
                    var memberWrapper = memberWrappers.FirstOrDefault(w => w.GetNameFromCustomAttributeOrDefault() == pair.Key);
                    if (memberWrapper != null)
                    {
                        var value = reader.GetValue(pair.Value);
                        DeserializeMemberValueIfNeeded(memberWrapper, ref value, xmlDeserializer, jsonDeserializer, csvDeserializer);
                        try
                        {
                            ExtFastMember.SetMemberValue(newInstance, memberWrapper.Name, value);
                        }
                        catch (InvalidOperationException) { }                         // These are properties or field without a setter
                        catch (ArgumentOutOfRangeException) { }
                    }
                    else
                    {
                        // Datareader return a columns that doesn't exist in type so skip it
                    }
                });
                return(newInstance);
            }
        }
        public void Test_MultiThreadingLookup()
        {
            var ret = new List <int>(50);

            ret.AddRange(Enumerable.Repeat(10, 1000));

            Parallel.ForEach(ret, delegate(int i, ParallelLoopState state)
            {
                ExtFastMember.GetMemberWrappers(typeof(PublicPropertiesModel), true);
                ExtFastMember.GetMemberWrappers(typeof(PublicPropertiesNoAccessor), true);
            });
        }
 /// <summary>
 /// Gets the non identity fields.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <returns>List&lt;AdvanceMember&gt;.</returns>
 public static List <AdvanceMember> GetNonIdentityFields <T>(T poco = null) where T : class
 {
     if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(typeof(T)))
     {
         // Get the primary key fields - The properties in the class decorated with PrimaryKey attribute.
         return(ExtFastMember.GetAdvanceMembersForDynamic <T>(poco).Where(m => m.SqlCustomAttritube.AutoIncrementBy == null && m.SqlCustomAttritube.Ignore != true && m.SqlTableAttritube == null).ToList());
     }
     else
     {
         // Get the primary key fields - The properties in the class decorated with PrimaryKey attribute.
         return(ExtFastMember.GetAdvanceMembers <T>().Where(m => m.SqlCustomAttritube.AutoIncrementBy == null && m.SqlCustomAttritube.Ignore != true && m.SqlTableAttritube == null).ToList());
     }
 }
        public void Test_SettingNullablePropertiesValue_To_Null()
        {
            var obj = new NullableFields();

            ExtFastMember.SetMemberValue(obj, "Decimal", null);
            ExtFastMember.SetMemberValue(obj, "DateTime", null);
            ExtFastMember.SetMemberValue(obj, "DateTimeOffset", null);
            ExtFastMember.SetMemberValue(obj, "Object", null);

            ExtFastMember.SetMemberValue(obj, "Decimal", DBNull.Value);
            ExtFastMember.SetMemberValue(obj, "DateTime", DBNull.Value);
            ExtFastMember.SetMemberValue(obj, "DateTimeOffset", DBNull.Value);
            ExtFastMember.SetMemberValue(obj, "Object", DBNull.Value);
        }
Ejemplo n.º 27
0
        /// <summary>
        /// Builds the delete query.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlBuilder">The SQL builder.</param>
        /// <param name="tableName">Name of the table.</param>
        /// <param name="overrideKeys"></param>
        private void BuildDeleteQuery <T>(StringBuilder sqlBuilder, string tableName, params Expression <Func <T, object> >[] overrideKeys) where T : class
        {
            var primaryKeys = overrideKeys.GetPropertyNamesFromExpressions();

            if (primaryKeys.IsNullOrEmpty())
            {
                throw new MissingKeyAttributeException(ExceptionHelper.MissingKeyMessage);
            }

            sqlBuilder.Append($"{SqlGenerator.BuildDeleteFromTable(tableName.GetTableName(DatabaseType, typeof(T)))} ");
            var whereClauseFields = ExtFastMember.GetMemberWrappers <T>(IncludeNonPublicAccessor).Where(m => primaryKeys.Contains(m.Name)).AsList();

            sqlBuilder.Append($"{SqlGenerator.BuildWhereClauseFromMembers(SqlSyntaxHelper, whereClauseFields, !AlwaysCreateParamaterizedSql)}");
        }
        //  /// <summary>
        //  /// Builds the insert query and return the expression.
        //  /// </summary>
        //  /// <typeparam name="T"></typeparam>
        //  /// <param name="sqlBuilder">The SQL builder.</param>
        //  /// <param name="tableName">Name of the table.</param>
        //  /// <param name="expression"></param>
        //  internal void BuildUpdateQueryWithOutputs<T>(StringBuilder sqlBuilder, string tableName) where T : class
        //  {
        //
        //      var outputFields = new List<string>() { };
        //      var members = ExtFastMember.GetAdvanceMembers<T>();
        //
        //      if (members.Exists(a => a.SqlCustomAttritube.AutoIncrementBy != null && a.SqlCustomAttritube.AutoIncrementBy > 0))
        //          outputFields.Add(members.First(a => a.SqlCustomAttritube.AutoIncrementBy != null && a.SqlCustomAttritube.AutoIncrementBy > 0).Member.Name);
        //
        //
        //      var allFields = GetNonIdentityFields<T>();
        //      // Insert sql statement prefix
        //
        //      sqlBuilder.Append($"INSERT INTO {tableName} (");
        //
        //      // Add field names
        //      allFields.ForEach(p => sqlBuilder.Append($"[{p.GetActualMemberName()}],"));
        //      sqlBuilder.Remove(sqlBuilder.Length - 1, 1); // Remove the last comma
        //
        //      // Add parameter names for values
        //      sqlBuilder.Append($" ) {Environment.NewLine}");
        //      sqlBuilder.Append($" OUTPUT ");
        //
        //
        //      outputFields.ForEach(delegate (string s) {
        //          sqlBuilder.Append($" UPDATED.[{members.FirstOrDefault(av => av.Member.Name == s)?.SqlCustomAttritube.MapTo ?? s}] ,");
        //      });
        //      // outputFields.ForEach(delegate (string s) {
        //      //     sqlBuilder.Append($" INSERTED.[{s}] ,");
        //      // });
        //      if (!outputFields.IsNullOrEmpty())
        //      {
        //          sqlBuilder.Remove(sqlBuilder.Length - 1, 1);
        //      }
        //
        //      sqlBuilder.Append($"{Environment.NewLine} VALUES (");
        //      allFields.ForEach(p => sqlBuilder.Append($"@{p.Member.Name},"));
        //      sqlBuilder.Remove(sqlBuilder.Length - 1, 1); // Remove the last comma
        //      sqlBuilder.Append(")");
        //  }


        /// <summary>
        /// Builds the insert query and return the expression.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="sqlBuilder">The SQL builder.</param>
        /// <param name="tableName">Name of the table.</param>
        /// <param name="expression"></param>
        public void BuildInsertQueryWithOutputs <T>(StringBuilder sqlBuilder, string tableName) where T : class
        {
            var outputFields = new List <string>()
            {
            };
            var members = ExtFastMember.GetAdvanceMembers <T>();

            if (members.Exists(a => a.SqlCustomAttritube.AutoIncrementBy != null && a.SqlCustomAttritube.AutoIncrementBy > 0))
            {
                outputFields.Add(members.First(a => a.SqlCustomAttritube.AutoIncrementBy != null && a.SqlCustomAttritube.AutoIncrementBy > 0).Member.Name);
            }


            var allFields = GetNonIdentityFields <T>();

            // Insert sql statement prefix

            sqlBuilder.Append($"INSERT INTO {tableName} (");

            // Add field names
            allFields.ForEach(p => sqlBuilder.Append($"[{p.GetActualMemberName()}],"));
            sqlBuilder.Remove(sqlBuilder.Length - 1, 1); // Remove the last comma

            // Add parameter names for values
            sqlBuilder.Append($" ) {Environment.NewLine}");


            if (DatabaseType != DataBaseType.Sqlite) // SQLITE DOESN'T SUPPORT THIS SYNTAX
            {
                sqlBuilder.Append($" OUTPUT ");
                outputFields.ForEach(delegate(string s)
                {
                    sqlBuilder.Append($" INSERTED.[{members.FirstOrDefault(av => av.Member.Name == s)?.GetActualMemberName() ?? s}] ,");
                });
            }

            // outputFields.ForEach(delegate (string s) {
            //     sqlBuilder.Append($" INSERTED.[{s}] ,");
            // });
            if (!outputFields.IsNullOrEmpty())
            {
                sqlBuilder.Remove(sqlBuilder.Length - 1, 1);
            }

            sqlBuilder.Append($"{Environment.NewLine} VALUES (");
            allFields.ForEach(p => sqlBuilder.Append($"@{p.Member.Name},"));
            sqlBuilder.Remove(sqlBuilder.Length - 1, 1); // Remove the last comma
            sqlBuilder.Append(")");
        }
        /// <summary>
        /// Example *OUTPUT INSERTED.A , INSERTED.B, INSERTED.C*
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="syntax"></param>
        /// <param name="outputFields"></param>
        /// <returns></returns>
        internal static string BuildOutputFields <T>(SqlSyntaxHelper syntax, List <string> outputFields, OutputType outputType) where T : class
        {
            var o          = syntax.GetKeywordEscapeOpenChar();    // alias to keep code short    [
            var c          = syntax.GetKeywordEscapeClosedChar();  // alias to keep code short  ]
            var sqlBuilder = new StringBuilder();

            //sqlBuilder.Append($"{Environment.NewLine} OUTPUT");
            sqlBuilder.Append($"OUTPUT");
            var members = ExtFastMember.GetMemberWrappers <T>(true);

            outputFields.ForEach(delegate(string s)
            {
                sqlBuilder.Append($" {outputType}.{o}{members.First(av => av.Name == s).GetNameFromCustomAttributeOrDefault()}{c} ,");
            });
            sqlBuilder.Remove(sqlBuilder.Length - 1, 1);
            return(sqlBuilder.ToString());
        }
 /// <summary>
 /// Gets the non key fields.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <returns>List&lt;AdvanceMember&gt;.</returns>
 public List <AdvanceMember> GetNonKeyFields <T>(T poco = null) where T : class
 {
     if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(typeof(T)))
     {
         // Get non primary key fields - the ones we want to update.
         return(ExtFastMember.GetAdvanceMembersForDynamic <T>(poco).Where(m =>
                                                                          m.SqlCustomAttritube.PrimaryKey != true && m.SqlCustomAttritube.Ignore != true &&
                                                                          m.SqlTableAttritube == null).ToList());
     }
     else
     {
         // Get non primary key fields - the ones we want to update.
         return(ExtFastMember.GetAdvanceMembers <T>(poco).Where(m =>
                                                                m.SqlCustomAttritube.PrimaryKey != true && m.SqlCustomAttritube.Ignore != true &&
                                                                m.SqlTableAttritube == null).ToList());
     }
 }