Ejemplo n.º 1
0
        public void OptimizeContainsNullableIdsTest()
        {
            using (var container = new RhetosTestContainer())
            {
                var repository = container.Resolve <Common.DomRepository>();

                var id1 = Guid.NewGuid();
                var id2 = Guid.NewGuid();
                var id3 = Guid.NewGuid();
                container.Resolve <ISqlExecuter>().ExecuteSql(new[]
                {
                    $@"INSERT INTO Test12.Entity1 (ID) SELECT '{id1}';",
                    $@"INSERT INTO Test12.Entity2 (ID, Entity1ID) SELECT '{id2}', '{id1}';",
                    $@"INSERT INTO Test12.Entity3 (ID, Entity2ID) SELECT '{id3}', '{id2}';"
                });

                var listIds = new List <Guid?> {
                    id1
                };

                var containsExpression = EFExpression.OptimizeContains <Common.Queryable.Test12_Entity3>(x => listIds.Contains(x.Entity2.Entity1ID.Value));
                var whereContainsSql   = repository.Test12.Entity3.Query().Where(containsExpression).ToString();
                Assert.IsFalse(whereContainsSql.ToLower().Contains(id1.ToString().ToLower()));
                Assert.AreEqual(id3, repository.Test12.Entity3.Query().Where(containsExpression).Single().ID);

                var containsExpression2 = EFExpression.OptimizeContains <Common.Queryable.Test12_Entity3>(x => listIds.Contains(x.Entity2.Entity1ID));
                var whereContainsSql2   = repository.Test12.Entity3.Query().Where(containsExpression2).ToString();
                Assert.IsFalse(whereContainsSql2.ToLower().Contains(id1.ToString().ToLower()));
                Assert.AreEqual(id3, repository.Test12.Entity3.Query().Where(containsExpression2).Single().ID);
            }
        }
Ejemplo n.º 2
0
        public void UsingListConstructorWotChangeExpressionTest()
        {
            var id1 = Guid.NewGuid();
            Expression <Func <Common.Queryable.Test12_Entity1, bool> > originalExpression = x => new List <Guid?> {
                id1
            }.Contains(x.GuidProperty);
            var optimizedExpression = EFExpression.OptimizeContains(originalExpression);

            Assert.AreEqual(originalExpression, optimizedExpression);
        }
Ejemplo n.º 3
0
        public void DontEvaluateEnumerable()
        {
            IEnumerable <Guid> items = Enumerable.Range(0, 1).Select <int, Guid>(x => throw new Rhetos.FrameworkException("Enumeration should not be evaluated during optimization."));
            Expression <Func <Guid, bool> > expression = id => items.Contains(id);

            Console.WriteLine(expression);
            expression = EFExpression.OptimizeContains(expression);
            Console.WriteLine(expression);

            TestUtility.ShouldFail <Rhetos.FrameworkException>(
                () => Assert.AreEqual(1, items.Count()),
                "Enumeration should not be evaluated during optimization.");
        }
Ejemplo n.º 4
0
        public void OptimizeContainsNullableWithMixedNullValueTest()
        {
            foreach (bool useDatabaseNullSemantics in new[] { false, true })
            {
                using (var container = new RhetosTestContainer())
                {
                    container.SetUseDatabaseNullSemantics(useDatabaseNullSemantics);
                    var repository = container.Resolve <Common.DomRepository>();

                    var id1 = Guid.NewGuid();
                    var id2 = Guid.NewGuid();
                    container.Resolve <ISqlExecuter>().ExecuteSql(new[]
                    {
                        $@"INSERT INTO Test12.Entity1 (ID) SELECT '{id1}';",
                        $@"INSERT INTO Test12.Entity1 (ID) SELECT '{id2}';",
                    });
                    Console.WriteLine($"ID1: {id1}");
                    Console.WriteLine($"ID2: {id2}");

                    var listWithNullValue = new List <Guid?> {
                        null, id1
                    };

                    Expression <Func <Common.Queryable.Test12_Entity1, bool> > containsId = x => listWithNullValue.Contains(x.ID);
                    CompareQueries(
                        basicQuery: repository.Test12.Entity1.Query().Where(containsId),
                        optimizedQuery: repository.Test12.Entity1.Query().Where(EFExpression.OptimizeContains(containsId)),
                        testDescription: $"on ID dbNull={useDatabaseNullSemantics}");

                    Expression <Func <Common.Queryable.Test12_Entity1, bool> > containsGuidProperty = x => listWithNullValue.Contains(x.GuidProperty);
                    CompareQueries(
                        basicQuery: repository.Test12.Entity1.Query().Where(containsGuidProperty),
                        optimizedQuery: repository.Test12.Entity1.Query().Where(EFExpression.OptimizeContains(containsGuidProperty)),
                        testDescription: $"on GuidProperty dbNull={useDatabaseNullSemantics}");

                    Expression <Func <Common.Queryable.Test12_Entity1, bool> > notContainsId = x => !listWithNullValue.Contains(x.ID);
                    CompareQueries(
                        basicQuery: repository.Test12.Entity1.Query().Where(notContainsId),
                        optimizedQuery: repository.Test12.Entity1.Query().Where(EFExpression.OptimizeContains(notContainsId)),
                        testDescription: $"notin on ID dbNull={useDatabaseNullSemantics}");

                    Expression <Func <Common.Queryable.Test12_Entity1, bool> > notContainsGuidProperty = x => !listWithNullValue.Contains(x.GuidProperty);
                    CompareQueries(
                        basicQuery: repository.Test12.Entity1.Query().Where(notContainsGuidProperty),
                        optimizedQuery: repository.Test12.Entity1.Query().Where(EFExpression.OptimizeContains(notContainsGuidProperty)),
                        testDescription: $"notin on GuidProperty dbNull={useDatabaseNullSemantics}");
                }
            }
        }
Ejemplo n.º 5
0
        public void NestedPropertyContainsTest()
        {
            using (var container = new RhetosTestContainer())
            {
                var repository = container.Resolve <Common.DomRepository>();

                var c = new { Property1 = new {
                                  Property2 = new List <Guid> {
                                      Guid.NewGuid()
                                  }
                              } };
                Expression <Func <Common.Queryable.Test12_Entity1, bool> > expression = x => c.Property1.Property2.Contains(x.ID);
                Assert.AreEqual(expression, EFExpression.OptimizeContains(expression), "A nested propty currently is not considered in the optimization process.");
            }
        }
Ejemplo n.º 6
0
        public void OptimizeEnumerableContainsTest()
        {
            using (var container = new RhetosTestContainer())
            {
                var repository = container.Resolve <Common.DomRepository>();

                var guidArray = new Guid[] { Guid.NewGuid() };
                var sqlQuery  = repository.Test12.Entity1.Query().Where(EFExpression.OptimizeContains <Common.Queryable.Test12_Entity1>(x => guidArray.Contains(x.ID))).ToString();
                Assert.IsFalse(sqlQuery.ToLower().Contains(guidArray[0].ToString().ToLower()));

                Expression <Func <Common.Queryable.Test12_Entity1, bool> > expression = x => repository.Test12.Entity2.Subquery.Select(y => y.Entity1ID.Value).Contains(x.ID);
                Assert.AreEqual(expression, EFExpression.OptimizeContains(expression), "EFExpression.OptimizeContains should not try to optimize the method Queryable<T>.Contains(T item)");

                var enumerableMock = new IEnumerableMock <Guid>(guidArray.ToList());
                Expression <Func <Common.Queryable.Test12_Entity1, bool> > expression2 = x => enumerableMock.Contains(x.ID);
                Assert.AreEqual(expression2, EFExpression.OptimizeContains(expression2), "EFExpression.OptimizeContains should not try to optimize the method Enumerable<Guid>.Contains(IEnumerable<Guid> items, Guid item) if the items argument is not of type IList<Guid>");
            }
        }
Ejemplo n.º 7
0
        public void OptimizeContainsNullableWithNullValueTest()
        {
            using (var container = new RhetosTestContainer())
            {
                var repository = container.Resolve <Common.DomRepository>();

                var id1 = Guid.NewGuid();
                container.Resolve <ISqlExecuter>().ExecuteSql(new[]
                {
                    $@"INSERT INTO Test12.Entity1 (ID) SELECT '{id1}';",
                });

                var listWithNullValue = new List <Guid?> {
                    null
                };

                var record1 = repository.Test12.Entity1.Query().Where(EFExpression.OptimizeContains <Common.Queryable.Test12_Entity1>(x => listWithNullValue.Contains(x.GuidProperty))).Single();
                Assert.AreEqual(id1, record1.ID);
            }
        }