Skip to content

Commit

Permalink
Added support to INSERT FROM SELECT.
Browse files Browse the repository at this point in the history
  • Loading branch information
glecchi committed Nov 20, 2024
1 parent 8c09b07 commit ddb6650
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 5 deletions.
2 changes: 1 addition & 1 deletion Lib/CSQLQueryExpress/CSQLQueryExpress.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<Title>CSQLQueryExpress</Title>
<Version>1.3.4</Version>
<Version>1.3.5</Version>
<Description>A simple c# library to compile TSQL queries</Description>
<PackageProjectUrl></PackageProjectUrl>
<PackageReadmeFile>README.md</PackageReadmeFile>
Expand Down
26 changes: 23 additions & 3 deletions Lib/CSQLQueryExpress/Fragments/SQLQueryInsert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class SQLQueryInsert<T> : ISQLQueryFragment, ISQLQuery, ISQLQueryWithOutp
private readonly List<string> _tableColumns;
private readonly IDictionary<string, Expression> _insertParameters;
private readonly IDictionary<string, object> _insertProperties;
private readonly Expression[] _insertColumns;

internal SQLQueryInsert(IList<ISQLQueryFragment> fragments, SQLQuerySelect select)
{
Expand Down Expand Up @@ -73,6 +74,21 @@ internal SQLQueryInsert(IList<ISQLQueryFragment> fragments, Expression<Action<T>
AddSqlQueryInsertParameters();
}

internal SQLQueryInsert(IList<ISQLQueryFragment> fragments, SQLQuerySelect select, Expression<Func<T, object>>[] columns)
{
_fragments = fragments;

_select = select;

_insertColumns = columns;

_tableColumns = GetTableColumns();

_fragments.Add(this);

AddSqlQueryInsertSelect();
}

public SQLQueryFragmentType FragmentType { get { return SQLQueryFragmentType.Insert; } }

public SQLQueryOutput<TS> Output<TS>(Expression<Func<T, TS>> output)
Expand Down Expand Up @@ -119,6 +135,10 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
{
insertBuilder.Append($"{Environment.NewLine}({string.Join(", ", _tableColumns.Where(c => _insertParameters.ContainsKey(c)).Select(c => $"[{c}]"))})");
}
else if (_insertColumns != null)
{
insertBuilder.Append($"{Environment.NewLine}({string.Join(", ", _insertColumns.Select(u => expressionTranslator.GetColumnsWithoutTableAlias(expressionTranslator.Translate(u, FragmentType))))})");
}
else
{
insertBuilder.Append($"{Environment.NewLine}({string.Join(", ", _select.Select.Select(u => expressionTranslator.GetColumnsWithoutTableAlias(expressionTranslator.Translate(u, FragmentType))))})");
Expand Down Expand Up @@ -164,7 +184,7 @@ private List<string> GetTableColumns()
}
}

public class SQLQueryInsertValues : ISQLQueryFragment
internal class SQLQueryInsertValues : ISQLQueryFragment
{
private readonly List<string> _tableColumns;
private readonly IDictionary<string, object> _insertProperties;
Expand Down Expand Up @@ -192,7 +212,7 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
}
}

public class SQLQueryInsertValuesFromSelect<T> : ISQLQueryFragment
internal class SQLQueryInsertValuesFromSelect<T> : ISQLQueryFragment
{
private readonly SQLQuerySelect _select;

Expand Down Expand Up @@ -224,7 +244,7 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
}
}

public class SQLQueryInsertParameters<T> : ISQLQueryFragment
internal class SQLQueryInsertParameters<T> : ISQLQueryFragment
{
private readonly List<string> _tableColumns;
private IDictionary<string, Expression> _insertParameters;
Expand Down
9 changes: 8 additions & 1 deletion Lib/CSQLQueryExpress/Query/SQLQuery.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using CSQLQueryExpress.Fragments;

namespace CSQLQueryExpress
Expand Down Expand Up @@ -38,6 +40,11 @@ public SQLQueryInsert<T> Insert<T>(IDictionary<string, object> insert) where T :
return new SQLQueryInsert<T>(InitNewFragmentsList(), insert);
}

public SQLQueryInsert<T> Insert<T>(SQLQuerySelect select, params Expression<Func<T, object>>[] columns) where T : ISQLQueryEntity
{
return new SQLQueryInsert<T>(InitNewFragmentsList(), select, columns);
}

public SQLQueryUnion<T> Union<T>(SQLQuerySelect<T> firstSelect, SQLQuerySelect<T> secondSelect, params SQLQuerySelect<T>[] otherSelect)
{
return new SQLQueryUnion<T>(InitNewFragmentsList(), false, firstSelect, secondSelect, otherSelect);
Expand Down

0 comments on commit ddb6650

Please sign in to comment.