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<AdvanceMember>.</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); }
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"); }
/// <summary> /// Gets all non ignore fields. /// </summary> /// <returns>List<MemberWrapper>.</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<AdvanceMember>.</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()); }
/// <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); }
/// <summary> /// Gets the non identity fields. /// </summary> /// <returns>List<MemberWrapper>.</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()); }
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"); }
/// <summary> /// Gets all non ignore fields. /// </summary> /// <typeparam name="T"></typeparam> /// <returns>List<MemberWrapper>.</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); }
/// <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<AdvanceMember>.</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); }
/// <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<AdvanceMember>.</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()); } }