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); } }
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); }
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."); }
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}"); } } }
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."); } }
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>"); } }
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); } }