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

Commit a0c7984

Browse files
committed
Add new APIs for db.ColumnLazy
1 parent 512a5e4 commit a0c7984

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

src/ServiceStack.OrmLite/OrmLiteReadConnectionExtensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,24 @@ public static List<T> Column<T>(this IDbConnection dbConn, ISqlExpression query)
238238
return dbConn.Exec(dbCmd => dbCmd.Column<T>(query.ToSelectStatement()));
239239
}
240240

241+
/// <summary>
242+
/// Returns the first column in a List using a SqlFormat query. E.g:
243+
/// <para>db.ColumnLazy&lt;string&gt;("SELECT LastName FROM Person WHERE Age = @age", new { age = 27 })</para>
244+
/// </summary>
245+
public static IEnumerable<T> ColumnLazy<T>(this IDbConnection dbConn, string sql, object anonType = null)
246+
{
247+
return dbConn.ExecLazy(dbCmd => dbCmd.ColumnLazy<T>(sql, anonType));
248+
}
249+
250+
/// <summary>
251+
/// Returns the distinct first column values in a HashSet using an SqlExpression. E.g:
252+
/// <para>db.ColumnLazy&lt;int&gt;(db.From&lt;Persion&gt;().Select(x => x.LastName).Where(q => q.Age == 27))</para>
253+
/// </summary>
254+
public static IEnumerable<T> ColumnLazy<T>(this IDbConnection dbConn, ISqlExpression query)
255+
{
256+
return dbConn.ExecLazy(dbCmd => dbCmd.ColumnLazy<T>(query.ToSelectStatement()));
257+
}
258+
241259
/// <summary>
242260
/// Returns the first column in a List using a SqlFormat query. E.g:
243261
/// <para>db.Column&lt;string&gt;("SELECT LastName FROM Person WHERE Age = @age", new { age = 27 })</para>

src/ServiceStack.OrmLite/OrmLiteReadExtensions.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,34 @@ internal static IEnumerable<T> SelectLazy<T>(this IDbCommand dbCmd, string sql,
479479
}
480480
}
481481

482+
internal static IEnumerable<T> ColumnLazy<T>(this IDbCommand dbCmd, string sql, object anonType = null)
483+
{
484+
if (anonType != null) dbCmd.SetParameters<T>(anonType, excludeDefaults: false);
485+
var dialectProvider = OrmLiteConfig.DialectProvider;
486+
dbCmd.CommandText = dialectProvider.ToSelectStatement(typeof(T), sql);
487+
488+
if (OrmLiteConfig.ResultsFilter != null)
489+
{
490+
foreach (var item in OrmLiteConfig.ResultsFilter.GetColumn<T>(dbCmd))
491+
{
492+
yield return item;
493+
}
494+
yield break;
495+
}
496+
497+
using (var reader = dbCmd.ExecuteReader())
498+
{
499+
while (reader.Read())
500+
{
501+
var value = dialectProvider.ConvertDbValue(reader.GetValue(0), typeof(T));
502+
if (value == DBNull.Value)
503+
yield return default(T);
504+
else
505+
yield return (T)value;
506+
}
507+
}
508+
}
509+
482510
internal static IEnumerable<T> WhereLazy<T>(this IDbCommand dbCmd, object anonType)
483511
{
484512
dbCmd.SetFilters<T>(anonType);

tests/ServiceStack.OrmLite.Tests/OrmLiteSelectTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,28 @@ public void Can_loop_each_string_from_ModelWithOnlyStringFields_table()
148148
}
149149
}
150150

151+
[Test]
152+
public void Can_loop_each_string_from_ModelWithOnlyStringFields_table_Column()
153+
{
154+
using (var db = OpenDbConnection())
155+
{
156+
db.DropAndCreateTable<ModelWithOnlyStringFields>();
157+
158+
var rowIds = new List<string>(new[] { "id-1", "id-2", "id-3" });
159+
160+
rowIds.ForEach(x => db.Insert(ModelWithOnlyStringFields.Create(x)));
161+
162+
var dbRowIds = new List<string>();
163+
foreach (var rowId in db.ColumnLazy<string>(
164+
db.From<ModelWithOnlyStringFields>().Select(x => x.Id)))
165+
{
166+
dbRowIds.Add(rowId);
167+
}
168+
169+
Assert.That(dbRowIds, Is.EquivalentTo(rowIds));
170+
}
171+
}
172+
151173
[Test]
152174
public void Can_loop_each_with_filter_from_ModelWithOnlyStringFields_table()
153175
{

0 commit comments

Comments
 (0)