예제 #1
0
        public void Can_Query_For_Data()
        {
            using (var dataProvider = Sqlite3DataProvider.InMemory())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw(
                                                 "CREATE TABLE TestTable (Value TEXT)"
                                                 ));
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw(
                                                 "INSERT INTO TestTable VALUES ('Hello World')"
                                                 ));

                var table = QueryExpression.Table("TestTable");
                using (var queryResult = dataProvider.ExecuteReader(QueryExpression.Select(
                                                                        projection: new[] { QueryExpression.Column("Value", table) },
                                                                        from: table
                                                                        )))
                {
                    Assert.IsTrue(queryResult.HasRows);
                    Assert.IsTrue(queryResult.Read());
                    Assert.AreEqual("Hello World", queryResult.GetString(0));
                }
            }
        }
예제 #2
0
        public void Can_Select_Bound_Complex_Type_With_Transform()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Has_Complex_Type>()
                         .Build();
            var sqlDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Has_Complex_Type> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {sqlDataModel.StorageModel.DefaultTableName}
					(
						[Complex_A] INTEGER,
						[Complex_B] INTEGER
					)"                    ));

                var a = 2;
                var b = 4;

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName),
                                                 new[] { QueryExpression.Column("Complex_A"), QueryExpression.Column("Complex_B") },
                                                 new[] { QueryExpression.Value(a), QueryExpression.Value(b) }
                                                 ));

                var binding = new TypeBindingBuilder <Has_Complex_Type, Custom_View>()
                              .Bind(q => q.Sum, q => q.Complex, o => o.A + o.B)
                              .Bind(q => q.Product, q => q.Complex, o => o.A * o.B)
                              .BuildBinding();

                var dataSet = new SqlDataSet <Has_Complex_Type>(sqlDataModel, dataProvider);
                var result  = dataSet.Select <Custom_View>(binding).ToSingle();

                Assert.AreEqual(a + b, result.Sum);
                Assert.AreEqual(a * b, result.Product);
            }
        }
예제 #3
0
        public void Select_View_And_Expression_Returns_Zipped_DataSet()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Flat_Entity>()
                         .Build();
            var sqlDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Flat_Entity> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {sqlDataModel.StorageModel.DefaultTableName}
					(
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
						[Value] INTEGER
					)"                    ));

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName),
                                                 new[] { QueryExpression.Column("Value") },
                                                 new[] { QueryExpression.Value(2) },
                                                 new[] { QueryExpression.Value(4) }
                                                 ));

                var dataSet  = new SqlDataSet <Flat_Entity>(sqlDataModel, dataProvider);
                var valueSet = dataSet
                               .Select(q => q.Id)
                               .Select <Flat_Entity_Value_View>()
                               .ToList();

                Assert.IsTrue(
                    valueSet.Select(q => q.Item1).SequenceEqual(new[] { 1, 2 })
                    );
                Assert.IsTrue(
                    valueSet.Select(q => q.Item2.Value).SequenceEqual(new[] { 2, 4 })
                    );
            }
        }
예제 #4
0
        public void Insert_Flat_View_With_Binding_And_Transform()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Flat_Entity>()
                         .Build();
            var sqlDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Flat_Entity> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {sqlDataModel.StorageModel.DefaultTableName}
					(
						[Value] INTEGER
					)"                    ));

                var dataSet = new SqlDataSet <Flat_Entity>(sqlDataModel, dataProvider);
                var value   = 5;
                var view    = new { Custom = value.ToString() };

                var transformWasCalled = false;
                dataSet.Insert(view, binding =>
                               binding.Bind(t => t.Value, s => s.Custom, value =>
                {
                    transformWasCalled = true;
                    return(int.Parse(value));
                })).Execute();

                Assert.IsTrue(transformWasCalled);
                using (var result = dataProvider.ExecuteReader(QueryExpression.Select(new[] { QueryExpression.All() }, from: QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName))))
                {
                    Assert.IsTrue(result.HasRows);
                    Assert.IsTrue(result.Read());
                    Assert.AreEqual(value, result.GetInt32(0));
                }
            }
        }
예제 #5
0
        public void Batch_Sql_Operates()
        {
            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE Entities
					(
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
						[Value] INTEGER
					)"                    ));

                var context      = DataContext.Create <TestDataContext>(dataProvider);
                var newEntityOne = new EntityType {
                    Value = 2
                };
                var newEntityTwo = new EntityType {
                    Value = 3
                };
                var retrievedEntity = new EntityType();

                Batch.Create()
                .Insert(context.Entities.Insert(newEntityOne))
                .Insert(context.Entities.Insert(newEntityTwo))
                .Update(context.Entities.Update().Set(q => q.Value, q => q.Value + 1))
                .Inject(context.Entities.Select().AndWhere(q => q.Id == 2), retrievedEntity)
                .Delete(context.Entities.Delete().AndWhere(q => q.Id == 1))
                .List(context.Entities.Select(q => q.Value), out var fullValueSetResult)
                .Single(context.Entities.Select(q => q.Id), out var singleIdResult)
                .Execute();

                Assert.AreEqual(2, retrievedEntity.Id);
                Assert.AreEqual(4, retrievedEntity.Value);
                Assert.IsTrue(new[] { 4 }.SequenceEqual(fullValueSetResult.Result));
                Assert.AreEqual(2, singleIdResult.Result);
            }
        }
예제 #6
0
        public void Can_Update_Field_To_Null_With_Entity()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Flat_Entity>()
                         .Build();
            var sqlDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Flat_Entity> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {sqlDataModel.StorageModel.DefaultTableName}
					(
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
						[Value] TEXT
					)"                    ));

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName),
                                                 new[] { QueryExpression.Column("Value") },
                                                 new[] { QueryExpression.Value("Hello") }
                                                 ));

                var dataSet = new SqlDataSet <Flat_Entity>(sqlDataModel, dataProvider);
                var entity  = new Flat_Entity {
                    Id = 1, Value = null
                };
                dataSet.Update(entity).Execute();

                using (var result = dataProvider.ExecuteReader(QueryExpression.Select(new[] { QueryExpression.All() }, from: QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName))))
                {
                    Assert.IsTrue(result.HasRows);
                    Assert.IsTrue(result.Read());
                    Assert.IsTrue(result.IsDBNull(1));
                }
            }
        }
예제 #7
0
        public void Can_Rollback_By_Disposing_Transaction()
        {
            using (var dataProvider = Sqlite3DataProvider.InMemory())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw(
                                                 "CREATE TABLE TestTable (Value TEXT)"
                                                 ));

                using (var transaction = dataProvider.CreateTransaction())
                {
                    transaction.ExecuteNonQuery(Sqlite3QueryExpression.Raw(
                                                    "INSERT INTO TestTable VALUES ('Hello World')"
                                                    ));
                }

                using (var queryResult = dataProvider.ExecuteReader(QueryExpression.Select(
                                                                        projection: new[] { QueryExpression.All() },
                                                                        from: QueryExpression.Table("TestTable")
                                                                        )))
                {
                    Assert.IsFalse(queryResult.HasRows);
                }
            }
        }
예제 #8
0
        public void Insert_Complex_Entity_With_Relationship()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Flat_Entity>()
                         .AddSqlEntity <Complex_Entity>()
                         .Build();
            var flatDataModel    = schema.Sql.SqlEntities.OfType <SqlDataModel <Flat_Entity> >().First();
            var complexDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Complex_Entity> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {flatDataModel.StorageModel.DefaultTableName}
					(
						[Value] INTEGER,
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT
					)"                    ));
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {complexDataModel.StorageModel.DefaultTableName}
					(
						[Value] INTEGER,
						[Flat_Id] INTEGER
					)"                    ));

                var flatDataSet    = new SqlDataSet <Flat_Entity>(flatDataModel, dataProvider);
                var complexDataSet = new SqlDataSet <Complex_Entity>(complexDataModel, dataProvider);

                //  the ID here isn't written to the INSERT query because the ORM see's it as server generated (which it should be)
                var flatEntity = new Flat_Entity {
                    Id = 1, Value = 5
                };
                var complexEntity = new Complex_Entity {
                    Value = 6, Flat = flatEntity
                };

                flatDataSet.Insert(flatEntity).Execute();
                complexDataSet.Insert(complexEntity).Execute();

                using (var result = dataProvider.ExecuteReader(QueryExpression.Select(
                                                                   new[] { QueryExpression.All() },
                                                                   from: QueryExpression.Table(complexDataModel.StorageModel.DefaultTableName),
                                                                   joins: new[]
                {
                    QueryExpression.Join(
                        QueryExpression.Table(flatDataModel.StorageModel.DefaultTableName),
                        QueryExpression.AreEqual(
                            QueryExpression.Column("Flat_Id", QueryExpression.Table(complexDataModel.StorageModel.DefaultTableName)),
                            QueryExpression.Column("Id", QueryExpression.Table(flatDataModel.StorageModel.DefaultTableName))
                            ), JoinDirection.Left
                        )
                })))
                {
                    Assert.IsTrue(result.HasRows);
                    Assert.IsTrue(result.Read());
                    Assert.AreEqual(complexEntity.Value, result.GetInt32(0));
                    Assert.AreEqual(complexEntity.Flat.Id, result.GetInt32(1));
                    Assert.AreEqual(flatEntity.Value, result.GetInt32(2));
                    Assert.AreEqual(flatEntity.Id, result.GetInt32(3));
                }
            }
        }
예제 #9
0
        public void Select_Entity_With_Complex_Join_Returns_Entity()
        {
            var schema = new DataSchemaBuilder()
                         .AddSqlEntity <Really_Complex_Entity>()
                         .AddSqlEntity <Complex_Entity>()
                         .AddSqlEntity <Flat_Entity>()
                         .Build();
            var sqlDataModel = schema.Sql.SqlEntities.OfType <SqlDataModel <Really_Complex_Entity> >().First();

            using (var dataProvider = DataProvider.CreateTestProvider())
            {
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE Flat_Entity
					(
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
						[Value] INTEGER
					)"                    ));
                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE Complex_Entity
					(
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
						[Value] INTEGER,
						[Flat_Id] INTEGER
					)"                    ));

                dataProvider.ExecuteNonQuery(Sqlite3QueryExpression.Raw($@"
					CREATE TABLE {sqlDataModel.StorageModel.DefaultTableName}
					(
						[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
						[Value] INTEGER,
						[Complex_Id] INTEGER,
						[Flat_Id] INTEGER
					)"                    ));

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table("Flat_Entity"),
                                                 new[] { QueryExpression.Column("Value") },
                                                 new[] { QueryExpression.Value(7) },
                                                 new[] { QueryExpression.Value(8) }
                                                 ));

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table("Complex_Entity"),
                                                 new[] { QueryExpression.Column("Value"), QueryExpression.Column("Flat_Id") },
                                                 new[] { QueryExpression.Value(6), QueryExpression.Value(1) }
                                                 ));

                dataProvider.ExecuteNonQuery(QueryExpression.Insert(
                                                 QueryExpression.Table(sqlDataModel.StorageModel.DefaultTableName),
                                                 new[] { QueryExpression.Column("Value"), QueryExpression.Column("Flat_Id"), QueryExpression.Column("Complex_Id") },
                                                 new[] { QueryExpression.Value(5), QueryExpression.Value(2), QueryExpression.Value(1) }
                                                 ));

                var dataSet   = new SqlDataSet <Really_Complex_Entity>(sqlDataModel, dataProvider);
                var entitySet = dataSet.Select().ToList();
                var entity    = entitySet[0];

                Assert.AreEqual(1, entity.Id);
                Assert.AreEqual(5, entity.Value);
                Assert.AreEqual(2, entity.Flat.Id);
                Assert.AreEqual(8, entity.Flat.Value);
                Assert.AreEqual(1, entity.Complex.Id);
                Assert.AreEqual(6, entity.Complex.Value);
                Assert.AreEqual(1, entity.Complex.Flat.Id);
                Assert.AreEqual(7, entity.Complex.Flat.Value);
            }
        }