Skip to content

Commit ddb6650

Browse files
committed
Added support to INSERT FROM SELECT.
1 parent 8c09b07 commit ddb6650

File tree

3 files changed

+32
-5
lines changed

3 files changed

+32
-5
lines changed

Lib/CSQLQueryExpress/CSQLQueryExpress.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<TargetFramework>netstandard2.0</TargetFramework>
55
<Title>CSQLQueryExpress</Title>
6-
<Version>1.3.4</Version>
6+
<Version>1.3.5</Version>
77
<Description>A simple c# library to compile TSQL queries</Description>
88
<PackageProjectUrl></PackageProjectUrl>
99
<PackageReadmeFile>README.md</PackageReadmeFile>

Lib/CSQLQueryExpress/Fragments/SQLQueryInsert.cs

+23-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class SQLQueryInsert<T> : ISQLQueryFragment, ISQLQuery, ISQLQueryWithOutp
1414
private readonly List<string> _tableColumns;
1515
private readonly IDictionary<string, Expression> _insertParameters;
1616
private readonly IDictionary<string, object> _insertProperties;
17+
private readonly Expression[] _insertColumns;
1718

1819
internal SQLQueryInsert(IList<ISQLQueryFragment> fragments, SQLQuerySelect select)
1920
{
@@ -73,6 +74,21 @@ internal SQLQueryInsert(IList<ISQLQueryFragment> fragments, Expression<Action<T>
7374
AddSqlQueryInsertParameters();
7475
}
7576

77+
internal SQLQueryInsert(IList<ISQLQueryFragment> fragments, SQLQuerySelect select, Expression<Func<T, object>>[] columns)
78+
{
79+
_fragments = fragments;
80+
81+
_select = select;
82+
83+
_insertColumns = columns;
84+
85+
_tableColumns = GetTableColumns();
86+
87+
_fragments.Add(this);
88+
89+
AddSqlQueryInsertSelect();
90+
}
91+
7692
public SQLQueryFragmentType FragmentType { get { return SQLQueryFragmentType.Insert; } }
7793

7894
public SQLQueryOutput<TS> Output<TS>(Expression<Func<T, TS>> output)
@@ -119,6 +135,10 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
119135
{
120136
insertBuilder.Append($"{Environment.NewLine}({string.Join(", ", _tableColumns.Where(c => _insertParameters.ContainsKey(c)).Select(c => $"[{c}]"))})");
121137
}
138+
else if (_insertColumns != null)
139+
{
140+
insertBuilder.Append($"{Environment.NewLine}({string.Join(", ", _insertColumns.Select(u => expressionTranslator.GetColumnsWithoutTableAlias(expressionTranslator.Translate(u, FragmentType))))})");
141+
}
122142
else
123143
{
124144
insertBuilder.Append($"{Environment.NewLine}({string.Join(", ", _select.Select.Select(u => expressionTranslator.GetColumnsWithoutTableAlias(expressionTranslator.Translate(u, FragmentType))))})");
@@ -164,7 +184,7 @@ private List<string> GetTableColumns()
164184
}
165185
}
166186

167-
public class SQLQueryInsertValues : ISQLQueryFragment
187+
internal class SQLQueryInsertValues : ISQLQueryFragment
168188
{
169189
private readonly List<string> _tableColumns;
170190
private readonly IDictionary<string, object> _insertProperties;
@@ -192,7 +212,7 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
192212
}
193213
}
194214

195-
public class SQLQueryInsertValuesFromSelect<T> : ISQLQueryFragment
215+
internal class SQLQueryInsertValuesFromSelect<T> : ISQLQueryFragment
196216
{
197217
private readonly SQLQuerySelect _select;
198218

@@ -224,7 +244,7 @@ public string Translate(ISQLQueryTranslator expressionTranslator)
224244
}
225245
}
226246

227-
public class SQLQueryInsertParameters<T> : ISQLQueryFragment
247+
internal class SQLQueryInsertParameters<T> : ISQLQueryFragment
228248
{
229249
private readonly List<string> _tableColumns;
230250
private IDictionary<string, Expression> _insertParameters;

Lib/CSQLQueryExpress/Query/SQLQuery.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq.Expressions;
24
using CSQLQueryExpress.Fragments;
35

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

43+
public SQLQueryInsert<T> Insert<T>(SQLQuerySelect select, params Expression<Func<T, object>>[] columns) where T : ISQLQueryEntity
44+
{
45+
return new SQLQueryInsert<T>(InitNewFragmentsList(), select, columns);
46+
}
47+
4148
public SQLQueryUnion<T> Union<T>(SQLQuerySelect<T> firstSelect, SQLQuerySelect<T> secondSelect, params SQLQuerySelect<T>[] otherSelect)
4249
{
4350
return new SQLQueryUnion<T>(InitNewFragmentsList(), false, firstSelect, secondSelect, otherSelect);

0 commit comments

Comments
 (0)