Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 203d4bc

Browse files
committed
Add support for InsertOnly/Async using Assignment Expression
1 parent be583b6 commit 203d4bc

12 files changed

+111
-1
lines changed

src/ServiceStack.OrmLite/Async/WriteExpressionCommandExtensionsAsync.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,22 @@ internal static Task InsertOnlyAsync<T>(this IDbCommand dbCmd, T obj, Expression
109109
return dbCmd.ExecuteSqlAsync(sql, token);
110110
}
111111

112+
public static Task<int> InsertOnlyAsync<T>(this IDbCommand dbCmd, Expression<Func<T>> insertFields, CancellationToken token)
113+
{
114+
if (insertFields == null)
115+
throw new ArgumentNullException("insertFields");
116+
117+
if (OrmLiteConfig.InsertFilter != null)
118+
OrmLiteConfig.InsertFilter(dbCmd, CachedExpressionCompiler.Evaluate(insertFields));
119+
120+
var insertFieldsValues = insertFields.AssignedValues();
121+
dbCmd.GetDialectProvider().PrepareParameterizedInsertStatement<T>(dbCmd, insertFieldsValues.Keys);
122+
123+
dbCmd.SetParameters(insertFieldsValues, excludeDefaults: false);
124+
125+
return dbCmd.ExecNonQueryAsync(token);
126+
}
127+
112128
internal static Task<int> DeleteAsync<T>(this IDbCommand dbCmd, Expression<Func<T, bool>> where, CancellationToken token)
113129
{
114130
var q = dbCmd.GetDialectProvider().SqlExpression<T>();

src/ServiceStack.OrmLite/Expressions/WriteExpressionCommandExtensions.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,22 @@ public static void InsertOnly<T>(this IDbCommand dbCmd, T obj, Expression<Func<T
150150
dbCmd.ExecuteSql(sql);
151151
}
152152

153+
public static int InsertOnly<T>(this IDbCommand dbCmd, Expression<Func<T>> insertFields)
154+
{
155+
if (insertFields == null)
156+
throw new ArgumentNullException("insertFields");
157+
158+
if (OrmLiteConfig.InsertFilter != null)
159+
OrmLiteConfig.InsertFilter(dbCmd, CachedExpressionCompiler.Evaluate(insertFields));
160+
161+
var insertFieldsValues = insertFields.AssignedValues();
162+
dbCmd.GetDialectProvider().PrepareParameterizedInsertStatement<T>(dbCmd, insertFieldsValues.Keys);
163+
164+
dbCmd.SetParameters(insertFieldsValues, excludeDefaults:false);
165+
166+
return dbCmd.ExecNonQuery();
167+
}
168+
153169
public static int Delete<T>(this IDbCommand dbCmd, Expression<Func<T, bool>> where)
154170
{
155171
var ev = dbCmd.GetDialectProvider().SqlExpression<T>();

src/ServiceStack.OrmLite/OrmLiteWriteExpressionsApi.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,17 @@ public static void InsertOnly<T>(this IDbConnection dbConn, T obj, Expression<Fu
145145
dbConn.Exec(dbCmd => dbCmd.InsertOnly(obj, onlyFields));
146146
}
147147

148+
/// <summary>
149+
/// Using an SqlExpression to only Insert the fields specified, e.g:
150+
///
151+
/// db.InsertOnly(() => new Person { FirstName = "Amy" }));
152+
/// INSERT INTO "Person" ("FirstName") VALUES (@FirstName);
153+
/// </summary>
154+
public static int InsertOnly<T>(this IDbConnection dbConn, Expression<Func<T>> insertFields)
155+
{
156+
return dbConn.Exec(dbCmd => dbCmd.InsertOnly(insertFields));
157+
}
158+
148159
/// <summary>
149160
/// Delete the rows that matches the where expression, e.g:
150161
///

src/ServiceStack.OrmLite/OrmLiteWriteExpressionsApiAsync.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,17 @@ public static Task<int> UpdateAddAsync<T>(this IDbConnection dbConn,
153153
return dbConn.Exec(dbCmd => dbCmd.InsertOnlyAsync(obj, onlyFields, token));
154154
}
155155

156+
/// <summary>
157+
/// Using an SqlExpression to only Insert the fields specified, e.g:
158+
///
159+
/// db.InsertOnlyAsync(() => new Person { FirstName = "Amy" }));
160+
/// INSERT INTO "Person" ("FirstName") VALUES (@FirstName);
161+
/// </summary>
162+
public static Task<int> InsertOnlyAsync<T>(this IDbConnection dbConn, Expression<Func<T>> insertFields, CancellationToken token = default(CancellationToken))
163+
{
164+
return dbConn.Exec(dbCmd => dbCmd.InsertOnlyAsync(insertFields, token));
165+
}
166+
156167
/// <summary>
157168
/// Delete the rows that matches the where expression, e.g:
158169
///

tests/ServiceStack.OrmLite.Tests/ApiSqlServerTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ public void API_SqlServer_Examples()
242242
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, x => new { x.FirstName, x.Age });
243243
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES ('Amy',27)"));
244244

245+
db.InsertOnly(() => new PersonWithAutoId { FirstName = "Amy", Age = 27 });
246+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES (@FirstName,@Age)"));
247+
245248
db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 });
246249
Assert.That(db.GetLastSql(), Is.EqualTo("UPDATE \"Person\" SET \"FirstName\"=@FirstName, \"LastName\"=@LastName, \"Age\"=@Age WHERE \"Id\"=@Id"));
247250

tests/ServiceStack.OrmLite.Tests/ApiSqliteTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,9 @@ public void API_Sqlite_Examples()
247247
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, p => new { p.FirstName, p.Age });
248248
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES ('Amy',27)"));
249249

250+
db.InsertOnly(() => new PersonWithAutoId { FirstName = "Amy", Age = 27 });
251+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES (@FirstName,@Age)"));
252+
250253
db.Update(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 });
251254
Assert.That(db.GetLastSql(), Is.EqualTo("UPDATE \"Person\" SET \"FirstName\"=@FirstName, \"LastName\"=@LastName, \"Age\"=@Age WHERE \"Id\"=@Id"));
252255

tests/ServiceStack.OrmLite.Tests/Legacy/ApiSqlServerLegacyTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ public void API_SqlServer_Legacy_Examples()
8282
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, q => q.Insert(x => new { x.FirstName, x.Age }));
8383
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES ('Amy',27)"));
8484

85-
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, q => db.From<PersonWithAutoId>().Insert(x => new { x.FirstName, x.Age }));
85+
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, db.From<PersonWithAutoId>().Insert(x => new { x.FirstName, x.Age }));
86+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES ('Amy',27)"));
87+
88+
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, q => q.Insert(x => new { x.FirstName, x.Age }));
8689
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES ('Amy',27)"));
8790

8891
db.UpdateOnly(new Person { FirstName = "JJ", LastName = "Hendo" }, q => q.Update(x => x.FirstName));

tests/ServiceStack.OrmLite.Tests/OrmLiteInsertTests.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using NUnit.Framework;
44
using ServiceStack.Common.Tests.Models;
55
using ServiceStack.DataAnnotations;
6+
using ServiceStack.OrmLite.Tests.Shared;
67
using ServiceStack.Text;
78

89
namespace ServiceStack.OrmLite.Tests
@@ -222,6 +223,40 @@ public void Can_GetLastInsertedId_using_Insert()
222223
Assert.Greater(lastInsertId, 0, "with InsertParam");
223224
}
224225
}
226+
227+
[Test]
228+
public void Can_InsertOnly_selected_fields()
229+
{
230+
using (var db = OpenDbConnection())
231+
{
232+
db.DropAndCreateTable<PersonWithAutoId>();
233+
234+
db.InsertOnly(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, x => new { x.FirstName, x.Age });
235+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES ('Amy',27)"));
236+
237+
var row = db.Select<PersonWithAutoId>()[0];
238+
Assert.That(row.FirstName, Is.EqualTo("Amy"));
239+
Assert.That(row.Age, Is.EqualTo(27));
240+
Assert.That(row.LastName, Is.Null);
241+
}
242+
}
243+
244+
[Test]
245+
public void Can_InsertOnly_selected_fields_using_AssignmentExpression()
246+
{
247+
using (var db = OpenDbConnection())
248+
{
249+
db.DropAndCreateTable<PersonWithAutoId>();
250+
251+
db.InsertOnly(() => new PersonWithAutoId { FirstName = "Amy", Age = 27 });
252+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"PersonWithAutoId\" (\"FirstName\",\"Age\") VALUES (@FirstName,@Age)"));
253+
254+
var row = db.Select<PersonWithAutoId>()[0];
255+
Assert.That(row.FirstName, Is.EqualTo("Amy"));
256+
Assert.That(row.Age, Is.EqualTo(27));
257+
Assert.That(row.LastName, Is.Null);
258+
}
259+
}
225260
}
226261

227262
public class UserAuth

tests/ServiceStack.OrmLiteV45.Tests/ApiMySqlTestsAsync.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ await db.InsertAsync(new Person { Id = 8, FirstName = "Tupac", LastName = "Shaku
234234
await db.InsertOnlyAsync(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, p => new { p.FirstName, p.Age });
235235
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO `PersonWithAutoId` (`FirstName`,`Age`) VALUES ('Amy',27)"));
236236

237+
await db.InsertOnlyAsync(() => new PersonWithAutoId { FirstName = "Amy", Age = 27 });
238+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO `PersonWithAutoId` (`FirstName`,`Age`) VALUES (@FirstName,@Age)"));
239+
237240
await db.UpdateAsync(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 });
238241
Assert.That(db.GetLastSql(), Is.EqualTo("UPDATE `Person` SET `FirstName`=@FirstName, `LastName`=@LastName, `Age`=@Age WHERE `Id`=@Id"));
239242

tests/ServiceStack.OrmLiteV45.Tests/ApiPostgreSqlTestsAsync.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ await db.InsertAsync(new Person { Id = 8, FirstName = "Tupac", LastName = "Shaku
234234
await db.InsertOnlyAsync(new PersonWithAutoId { FirstName = "Amy", Age = 27 }, p => new { p.FirstName, p.Age });
235235
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"person_with_auto_id\" (\"first_name\",\"age\") VALUES ('Amy',27)"));
236236

237+
await db.InsertOnlyAsync(() => new PersonWithAutoId { FirstName = "Amy", Age = 27 });
238+
Assert.That(db.GetLastSql(), Is.EqualTo("INSERT INTO \"person_with_auto_id\" (\"first_name\",\"age\") VALUES (:FirstName,:Age)"));
239+
237240
await db.UpdateAsync(new Person { Id = 1, FirstName = "Jimi", LastName = "Hendrix", Age = 27 });
238241
Assert.That(db.GetLastSql(), Is.EqualTo("UPDATE \"person\" SET \"first_name\"=:FirstName, \"last_name\"=:LastName, \"age\"=:Age WHERE \"id\"=:Id"));
239242

0 commit comments

Comments
 (0)