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

Commit c8745eb

Browse files
committed
Fix reading scalar enums
1 parent 6f2f69e commit c8745eb

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

src/ServiceStack.OrmLite/Converters/SpecialConverters.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ public override object ToDbValue(Type fieldType, object value)
3838

3939
return enumValue;
4040
}
41+
42+
public override object FromDbValue(Type fieldType, object value)
43+
{
44+
var strVal = value as string;
45+
if (strVal != null)
46+
return Enum.Parse(fieldType, strVal, ignoreCase:true);
47+
48+
return Convert.ChangeType(value, fieldType.GetTypeCode());
49+
}
4150
}
4251

4352
public class RowVersionConverter : OrmLiteConverter

src/ServiceStack.OrmLite/OrmLiteReadCommandExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -680,7 +680,7 @@ internal static T ToScalar<T>(IOrmLiteDialectProvider dialectProvider, IDataRead
680680
if (underlyingType == typeof(object))
681681
return (T)reader.GetValue(0);
682682

683-
var converter = dialectProvider.GetConverter(underlyingType);
683+
var converter = dialectProvider.GetConverterBestMatch(underlyingType);
684684
if (converter != null)
685685
{
686686
object oValue = converter.GetValue(reader, columnIndex);

tests/ServiceStack.OrmLite.Tests/EnumTests.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Generic;
22
using System.Linq;
33
using NUnit.Framework;
4+
using ServiceStack.DataAnnotations;
45
using ServiceStack.Text;
56

67
namespace ServiceStack.OrmLite.Tests
@@ -278,6 +279,44 @@ public void Can_Select_Type_with_Nullable_Enum()
278279
Assert.That(row.Id, Is.EqualTo(2));
279280
}
280281
}
282+
283+
[Test]
284+
public void Can_get_Scalar_Enum()
285+
{
286+
using (var db = OpenDbConnection())
287+
{
288+
db.DropAndCreateTable<TypeWithEnum>();
289+
290+
var row = new TypeWithEnum { Id = 1, EnumValue = SomeEnum.Value2 };
291+
db.Insert(row);
292+
293+
var someEnum = db.Scalar<SomeEnum>(db.From<TypeWithEnum>()
294+
.Where(o => o.Id == row.Id)
295+
.Select(o => o.EnumValue));
296+
297+
Assert.That(someEnum, Is.EqualTo(SomeEnum.Value2));
298+
}
299+
}
300+
301+
[Test]
302+
public void Can_get_Scalar_Enum_Flag()
303+
{
304+
using (var db = OpenDbConnection())
305+
{
306+
db.DropAndCreateTable<TypeWithFlagsEnum>();
307+
308+
var row = new TypeWithFlagsEnum { Id = 1, Flags = FlagsEnum.FlagTwo };
309+
db.Insert(row);
310+
311+
row.PrintDump();
312+
313+
var flagsEnum = db.Scalar<FlagsEnum>(db.From<TypeWithFlagsEnum>()
314+
.Where(o => o.Id == row.Id)
315+
.Select(o => o.Flags));
316+
317+
Assert.That(flagsEnum, Is.EqualTo(FlagsEnum.FlagTwo));
318+
}
319+
}
281320
}
282321

283322

0 commit comments

Comments
 (0)