diff UnitTests/Linq/EnumMapping.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/UnitTests/Linq/EnumMapping.cs	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,1534 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using BLToolkit.Data.DataProvider;
+using BLToolkit.Data.Linq;
+using BLToolkit.DataAccess;
+using BLToolkit.Mapping;
+using NUnit.Framework;
+
+namespace Data.Linq
+{
+	[TestFixture, Category("MapValue")]
+	public class EnumMapping : TestBase
+	{
+		enum TestEnum1
+		{
+			[MapValue(11L)] Value1 = 3,
+			[MapValue(12L)] Value2,
+		}
+		enum TestEnum2
+		{
+			Value1 = 3,
+			Value2,
+		}
+		enum TestEnum3
+		{
+			Value1 = 3,
+			Value2,
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable1
+		{
+			[PrimaryKey, MapField("ID")] public int Id;
+			[MapField("BigIntValue")]    public TestEnum1 TestField;
+		}
+
+		[MapValue(TestEnum2.Value2, 12L)]
+		[TableName("LinqDataTypes")]
+		class TestTable2
+		{
+			[PrimaryKey, MapField("ID")]
+			public int Id;
+
+			[MapValue(TestEnum2.Value1, 11L)]
+			[MapField("BigIntValue")]
+			public TestEnum2 TestField;
+
+			[MapField("IntValue")]
+			public TestEnum3 Int32Field;
+		}
+
+		[TableName("LinqDataTypes")]
+		class NullableTestTable1
+		{
+			[PrimaryKey, MapField("ID")]
+			public int? Id;
+
+			[MapField("BigIntValue")]
+			public TestEnum1? TestField;
+		}
+
+		[MapValue(TestEnum2.Value2, 12L)]
+		[TableName("LinqDataTypes")]
+		class NullableTestTable2
+		{
+			[PrimaryKey, MapField("ID")]
+			public int? Id;
+
+			[MapValue(TestEnum2.Value1, 11L)]
+			[MapField("BigIntValue")]
+			public TestEnum2? TestField;
+
+			[MapField("IntValue")]
+			public TestEnum3? Int32Field;
+		}
+
+		[TableName("LinqDataTypes")]
+		class RawTable
+		{
+			[PrimaryKey, MapField("ID")]
+			public int Id;
+
+			[MapField("BigIntValue")]
+			public long TestField;
+
+			[MapField("IntValue")]
+			public int Int32Field;
+		}
+
+		class Cleaner : IDisposable
+		{
+			readonly ITestDataContext _db;
+
+			public Cleaner(ITestDataContext db)
+			{
+				_db = db;
+				Clean();
+			}
+
+			private void Clean()
+			{
+				_db.GetTable<RawTable>().Where(r => r.Id == RID).Delete();
+			}
+
+			public void Dispose()
+			{
+				try
+				{
+					// rollback emulation for WCF
+					Clean();
+				}
+				catch (Exception)
+				{
+				}
+			}
+		}
+
+		const long VAL2 = 12;
+		const long VAL1 = 11;
+		const int  RID  = 101;
+
+		[Test]
+		public void EnumMapInsert1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<TestTable1>().Insert(() => new TestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsert2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<TestTable2>().Insert(() => new TestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsert3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<NullableTestTable1>().Insert(() => new NullableTestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsert4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<NullableTestTable2>().Insert(() => new NullableTestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable1>().Where(r => r.Id == RID && r.TestField == TestEnum1.Value2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum1.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable2>().Where(r => r.Id == RID && r.TestField == TestEnum2.Value2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum1.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhere4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Update(r => new TestTable1 { TestField = TestEnum1.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Update(r => new TestTable2 { TestField = TestEnum2.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Update(r => new NullableTestTable1 { TestField = TestEnum1.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapUpdate4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Update(r => new NullableTestTable2 { TestField = TestEnum2.Value2 });
+
+					var result = db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2)
+						.Select(r => r.TestField)
+						.FirstOrDefault();
+
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectAnon1([DataContexts] string context)
+		{
+			using (var db  = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.That(result.TestField, Is.EqualTo(TestEnum1.Value2));
+				}
+			}
+		}
+
+		[Test]
+		public void EnumMapSelectAnon2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectAnon3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == TestEnum1.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectAnon4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == TestEnum2.Value2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable1>().Delete(r => r.Id == RID && r.TestField == TestEnum1.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable2>().Delete(r => r.Id == RID && r.TestField == TestEnum2.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable1>()
+						.Delete(r => r.Id == RID && r.TestField == TestEnum1.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDelete4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable2>()
+						.Delete(r => r.Id == RID && r.TestField == TestEnum2.Value2));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Set(r => r.TestField, TestEnum1.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Set(r => r.TestField, TestEnum2.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						Int32Field = 3
+					});
+
+					db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.Int32Field == TestEnum3.Value1)
+						.Set(r => r.Int32Field, () => TestEnum3.Value2).Update();
+					Assert.True(1 == db.GetTable<RawTable>().Where(r => r.Id == RID && r.Int32Field == 4).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value1)
+						.Set(r => r.TestField, TestEnum1.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet5()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL1
+					});
+
+					db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value1)
+						.Set(r => r.TestField, TestEnum2.Value2).Update();
+					var result = db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Select(r => r.TestField).FirstOrDefault();
+					Assert.True(result == VAL2);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSet6()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						Int32Field = 3
+					});
+
+					db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.Int32Field == TestEnum3.Value1)
+						.Set(r => r.Int32Field, () => TestEnum3.Value2).Update();
+					Assert.True(1 == db.GetTable<RawTable>().Where(r => r.Id == RID && r.Int32Field == 4).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContains1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && new[] { TestEnum1.Value2 }.Contains(r.TestField)).Count());
+				}
+			}
+		}
+
+		[Test]
+		public void EnumMapContains2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(db.GetTable<TestTable2>().Where(r => r.Id == RID && new[] { TestEnum2.Value2 }.Contains(r.TestField)).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContains3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && new[] { (TestEnum1?)TestEnum1.Value2 }.Contains(r.TestField)).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContains4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && new[] { (TestEnum2?)TestEnum2.Value2 }.Contains(r.TestField)).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectNull1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == null);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapSelectNull2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID)
+						.Select(r => new { r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.True(result.TestField == null);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhereNull1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == null)
+						.Select(r => new { r.TestField }).FirstOrDefault();
+					Assert.NotNull(result);
+					Assert.Null(result.TestField);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapWhereNull2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == null)
+						.Select(r => new { r.TestField }).FirstOrDefault();
+					Assert.NotNull(result);
+					Assert.Null(result.TestField);
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new TestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new TestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new NullableTestTable1
+					{
+						Id = RID,
+						TestField = TestEnum1.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>()
+						.Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertObject4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.Insert(new NullableTestTable2
+					{
+						Id = RID,
+						TestField = TestEnum2.Value2
+					});
+
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL2).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum1.Value1;
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new TestTable1
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<TestTable1>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum2.Value1;
+
+					var result = db.GetTable<TestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new TestTable2
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<TestTable2>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum1.Value1;
+
+					var result = db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2)
+						.Select(r => new NullableTestTable1
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<NullableTestTable1>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapInsertFromSelectWithParam4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var param = TestEnum2.Value1;
+
+					var result = db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2)
+						.Select(r => new NullableTestTable2
+						{
+							Id = r.Id,
+							TestField = param
+						})
+						.Insert(db.GetTable<NullableTestTable2>(), r => r);
+
+					Assert.AreEqual(1, result);
+					Assert.AreEqual(1, db.GetTable<RawTable>().Where(r => r.Id == RID && r.TestField == VAL1).Count());
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable1>().Delete(r => r.Id == RID && r.TestField.Equals(TestEnum1.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<TestTable2>().Delete(r => r.Id == RID && r.TestField.Equals(TestEnum2.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable1>()
+						.Delete(r => r.Id == RID && r.TestField.Equals(TestEnum1.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapDeleteEquals4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.True(1 == db.GetTable<NullableTestTable2>()
+						.Delete(r => r.Id == RID && r.TestField.Equals(TestEnum2.Value2)));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapCustomPredicate1([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var entityParameter = Expression.Parameter(typeof(TestTable1), "entity"); // parameter name required for BLToolkit
+					var filterExpression = Expression.Equal(Expression.Field(entityParameter, "TestField"), Expression.Constant(TestEnum1.Value2));
+					var filterPredicate = Expression.Lambda<Func<TestTable1, bool>>(filterExpression, entityParameter);
+					var result = db.GetTable<TestTable1>().Where(filterPredicate).ToList();
+
+					Assert.AreEqual(1, result.Count);
+				}
+			}
+		}
+
+		[Test]
+		public void EnumMapCustomPredicate2([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var entityParameter = Expression.Parameter(typeof(TestTable2), "entity"); // parameter name required for BLToolkit
+					var filterExpression = Expression.Equal(Expression.Field(entityParameter, "TestField"), Expression.Constant(TestEnum2.Value2));
+					var filterPredicate = Expression.Lambda<Func<TestTable2, bool>>(filterExpression, entityParameter);
+					var result = db.GetTable<TestTable2>().Where(filterPredicate).ToList();
+
+					Assert.AreEqual(1, result.Count);
+				}
+			}
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable3
+		{
+			[PrimaryKey]
+			public int ID;
+			
+			[MapField("BigIntValue")]
+			public TestEnum1? TargetType;
+
+			[MapField("IntValue")]
+			public int? TargetID;
+		}
+
+		struct ObjectReference
+		{
+			public TestEnum1 TargetType;
+			public int TargetID;
+			public ObjectReference(TestEnum1 targetType, int tagetId)
+			{
+				TargetType = targetType;
+				TargetID = tagetId;
+			}
+		}
+
+		[Test]
+		public void Test_4_1_18_Regression1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable()
+					{
+						Id = RID,
+						TestField = VAL2,
+						Int32Field = 10
+					});
+
+					var result = db.GetTable<TestTable3>().Where(r => r.ID == RID).Select(_ => new
+					{
+						Target = _.TargetType != null && _.TargetID != null
+						  ? new ObjectReference(_.TargetType.Value, _.TargetID.Value)
+						  : default(ObjectReference?)
+					})
+					.ToArray();
+
+					Assert.AreEqual(1, result.Length);
+					Assert.NotNull(result[0].Target);
+					Assert.AreEqual(10, result[0].Target.Value.TargetID);
+					Assert.AreEqual(TestEnum1.Value2, result[0].Target.Value.TargetType);
+				}
+			});
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable4
+		{
+			[PrimaryKey]
+			public int ID;
+
+			[MapField("BigIntValue")]
+			public TestEnum2? TargetType;
+
+			[MapField("IntValue")]
+			public int? TargetID;
+		}
+
+		struct ObjectReference2
+		{
+			public TestEnum2 TargetType;
+			public int TargetID;
+			public ObjectReference2(TestEnum2 targetType, int tagetId)
+			{
+				TargetType = targetType;
+				TargetID = tagetId;
+			}
+		}
+
+		[Test]
+		public void Test_4_1_18_Regression2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable()
+					{
+						Id = RID,
+						TestField = (long)TestEnum2.Value2,
+						Int32Field = 10
+					});
+
+					var result = db.GetTable<TestTable4>().Where(r => r.ID == RID).Select(_ => new
+					{
+						Target = _.TargetType != null && _.TargetID != null
+						  ? new ObjectReference2(_.TargetType.Value, _.TargetID.Value)
+						  : default(ObjectReference2?)
+					})
+					.ToArray();
+
+					Assert.AreEqual(1, result.Length);
+					Assert.NotNull(result[0].Target);
+					Assert.AreEqual(10, result[0].Target.Value.TargetID);
+					Assert.AreEqual(TestEnum2.Value2, result[0].Target.Value.TargetType);
+				}
+			});
+		}
+
+		class NullableResult
+		{
+			public TestEnum1? Value;
+		}
+
+		[Test]
+		public void EnumMapSelectNull([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID
+					});
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID)
+						.Select(r => new NullableResult {Value = r.TestField })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.Null(result.Value);
+				}
+			}
+		}
+
+		private TestEnum1 Convert(TestEnum1 val)
+		{
+			return val;
+		}
+
+		[Test]
+		public void EnumMapSelectNull_Regression([DataContexts] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var result = db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID)
+						.Select(r => new NullableResult { Value = Convert(r.TestField) })
+						.FirstOrDefault();
+
+					Assert.NotNull(result);
+					Assert.That(result.Value, Is.EqualTo(TestEnum1.Value2));
+				}
+			}
+		}
+
+		[Flags]
+		enum TestFlag
+		{
+			Value1 = 0x1,
+			Value2 = 0x2
+		}
+
+		[TableName("LinqDataTypes")]
+		class TestTable5
+		{
+			public int      ID;
+			public TestFlag IntValue;
+		}
+
+		[Test]
+		public void TestFlagEnum([DataContexts(ProviderName.Access)] string context)
+		{
+			using (var db = GetDataContext(context))
+			{
+				var result =
+					from t in db.GetTable<TestTable5>()
+					where (t.IntValue & TestFlag.Value1) != 0
+					select t;
+
+				var sql = result.ToString();
+
+				Assert.That(sql, Is.Not.Contains("Convert"));
+			}
+		}
+
+		[Test]
+		public void EnumMapContainsList1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum1>();
+					set.Add(TestEnum1.Value2);
+
+					Assert.That(db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<TestTable1>()
+						.Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContainsList2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum2>();
+					set.Add(TestEnum2.Value2);
+
+					Assert.That(db.GetTable<TestTable2>().Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<TestTable2>().Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContainsList3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum1?>();
+					set.Add(TestEnum1.Value2);
+
+					Assert.That(db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<NullableTestTable1>()
+						.Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapContainsList4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					var set = new HashSet<TestEnum2?>();
+					set.Add(TestEnum2.Value2);
+
+					Assert.That(db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && set.Contains(r.TestField)).Count(), Is.EqualTo(1));
+					Assert.That(db.GetTable<NullableTestTable2>()
+						.Where(r => r.Id == RID && !set.Contains(r.TestField)).Count(), Is.EqualTo(0));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapIntermediateObject1()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<TestTable1>()
+						.Select(r => new {r.Id, r.TestField})
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		//////[Test]
+		public void EnumMapIntermediateObject2()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<TestTable2>()
+						.Select(r => new { r.Id, r.TestField })
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		[Test]
+		public void EnumMapIntermediateObject3()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<NullableTestTable1>()
+						.Select(r => new { r.Id, r.TestField })
+						.Where(r => r.Id == RID && r.TestField == TestEnum1.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+
+		//////[Test]
+		public void EnumMapIntermediateObject4()
+		{
+			ForEachProvider(db =>
+			{
+				using (new Cleaner(db))
+				{
+					db.GetTable<RawTable>().Insert(() => new RawTable
+					{
+						Id = RID,
+						TestField = VAL2
+					});
+
+					Assert.That(
+						db.GetTable<NullableTestTable2>()
+						.Select(r => new { r.Id, r.TestField })
+						.Where(r => r.Id == RID && r.TestField == TestEnum2.Value2).Count(), Is.EqualTo(1));
+				}
+			});
+		}
+	}
+}