public void GenerateMemberTSql_returns_the_quoted_member_name() { Assert.Equal("[Magic]", DmlSqlGenerator.GenerateMemberTSql(CreateMockMember("Magic").Object)); Assert.Equal("[Magic]]Unicorn]", DmlSqlGenerator.GenerateMemberTSql(CreateMockMember("Magic]Unicorn").Object)); Assert.Equal("[[Magic]]]", DmlSqlGenerator.GenerateMemberTSql(CreateMockMember("[Magic]").Object)); Assert.Equal("[Magic[Unicorn]", DmlSqlGenerator.GenerateMemberTSql(CreateMockMember("Magic[Unicorn").Object)); }
public override void Visit(DbPropertyExpression expression) { Check.NotNull <DbPropertyExpression>(expression, nameof(expression)); if (!string.IsNullOrEmpty(this.PropertyAlias)) { this._commandText.Append(this.PropertyAlias); this._commandText.Append("."); } this._commandText.Append(DmlSqlGenerator.GenerateMemberTSql(expression.Property)); }
internal static string GenerateInsertSql( DbInsertCommandTree tree, SqlGenerator sqlGenerator, out List <SqlParameter> parameters, bool generateReturningSql = true, bool upperCaseKeywords = true, bool createParameters = true) { SqlStringBuilder commandText = new SqlStringBuilder(256) { UpperCaseKeywords = upperCaseKeywords }; DmlSqlGenerator.ExpressionTranslator translator = new DmlSqlGenerator.ExpressionTranslator(commandText, (DbModificationCommandTree)tree, null != tree.Returning, sqlGenerator, (ICollection <EdmProperty>)null, createParameters); bool useGeneratedValuesVariable = DmlSqlGenerator.UseGeneratedValuesVariable(tree, sqlGenerator.SqlVersion); EntityType elementType = (EntityType)((DbScanExpression)tree.Target.Expression).Target.ElementType; if (useGeneratedValuesVariable) { commandText.AppendKeyword("declare ").Append("@generated_keys").Append(" table("); bool flag = true; foreach (EdmMember keyMember in elementType.KeyMembers) { if (flag) { flag = false; } else { commandText.Append(", "); } commandText.Append(DmlSqlGenerator.GenerateMemberTSql(keyMember)).Append(" ").Append(DmlSqlGenerator.GetVariableType(sqlGenerator, keyMember)); Facet facet; if (keyMember.TypeUsage.Facets.TryGetValue("Collation", false, out facet)) { string s = facet.Value as string; if (!string.IsNullOrEmpty(s)) { commandText.AppendKeyword(" collate ").Append(s); } } } commandText.AppendLine(")"); } commandText.AppendKeyword("insert "); tree.Target.Expression.Accept((DbExpressionVisitor)translator); if (0 < tree.SetClauses.Count) { commandText.Append("("); bool flag = true; foreach (DbSetClause setClause in (IEnumerable <DbModificationClause>)tree.SetClauses) { if (flag) { flag = false; } else { commandText.Append(", "); } setClause.Property.Accept((DbExpressionVisitor)translator); } commandText.AppendLine(")"); } else { commandText.AppendLine(); } if (useGeneratedValuesVariable) { commandText.AppendKeyword("output "); bool flag = true; foreach (EdmMember keyMember in elementType.KeyMembers) { if (flag) { flag = false; } else { commandText.Append(", "); } commandText.Append("inserted."); commandText.Append(DmlSqlGenerator.GenerateMemberTSql(keyMember)); } commandText.AppendKeyword(" into ").AppendLine("@generated_keys"); } if (0 < tree.SetClauses.Count) { bool flag = true; commandText.AppendKeyword("values ("); foreach (DbSetClause setClause in (IEnumerable <DbModificationClause>)tree.SetClauses) { if (flag) { flag = false; } else { commandText.Append(", "); } setClause.Value.Accept((DbExpressionVisitor)translator); translator.RegisterMemberValue(setClause.Property, setClause.Value); } commandText.AppendLine(")"); } else { commandText.AppendKeyword("default values"); commandText.AppendLine(); } if (generateReturningSql) { DmlSqlGenerator.GenerateReturningSql(commandText, (DbModificationCommandTree)tree, elementType, translator, tree.Returning, useGeneratedValuesVariable); } parameters = translator.Parameters; return(commandText.ToString()); }
internal static void GenerateReturningSql( SqlStringBuilder commandText, DbModificationCommandTree tree, EntityType tableType, DmlSqlGenerator.ExpressionTranslator translator, DbExpression returning, bool useGeneratedValuesVariable) { if (returning == null) { return; } commandText.AppendKeyword("select "); if (useGeneratedValuesVariable) { translator.PropertyAlias = "t"; } returning.Accept((DbExpressionVisitor)translator); if (useGeneratedValuesVariable) { translator.PropertyAlias = (string)null; } commandText.AppendLine(); if (useGeneratedValuesVariable) { commandText.AppendKeyword("from "); commandText.Append("@generated_keys"); commandText.AppendKeyword(" as "); commandText.Append("g"); commandText.AppendKeyword(" join "); tree.Target.Expression.Accept((DbExpressionVisitor)translator); commandText.AppendKeyword(" as "); commandText.Append("t"); commandText.AppendKeyword(" on "); string keyword = string.Empty; foreach (EdmMember keyMember in tableType.KeyMembers) { commandText.AppendKeyword(keyword); keyword = " and "; commandText.Append("g."); string memberTsql = DmlSqlGenerator.GenerateMemberTSql(keyMember); commandText.Append(memberTsql); commandText.Append(" = t."); commandText.Append(memberTsql); } commandText.AppendLine(); commandText.AppendKeyword("where @@ROWCOUNT > 0"); } else { commandText.AppendKeyword("from "); tree.Target.Expression.Accept((DbExpressionVisitor)translator); commandText.AppendLine(); commandText.AppendKeyword("where @@ROWCOUNT > 0"); EntitySetBase target = ((DbScanExpression)tree.Target.Expression).Target; bool flag = false; foreach (EdmMember keyMember in target.ElementType.KeyMembers) { commandText.AppendKeyword(" and "); commandText.Append(DmlSqlGenerator.GenerateMemberTSql(keyMember)); commandText.Append(" = "); SqlParameter sqlParameter; if (translator.MemberValues.TryGetValue(keyMember, out sqlParameter)) { commandText.Append(sqlParameter.ParameterName); } else { if (flag) { throw new NotSupportedException(Strings.Update_NotSupportedServerGenKey((object)target.Name)); } if (!DmlSqlGenerator.IsValidScopeIdentityColumnType(keyMember.TypeUsage)) { throw new InvalidOperationException(Strings.Update_NotSupportedIdentityType((object)keyMember.Name, (object)keyMember.TypeUsage.ToString())); } commandText.Append("scope_identity()"); flag = true; } } } }