Mercurial > pub > bltoolkit
diff UnitTests/Linq/ConvertExpression.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/ConvertExpression.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,515 @@ +using System; +using System.Linq; + +using BLToolkit.Data.DataProvider; + +using NUnit.Framework; + +namespace Data.Linq +{ + [TestFixture] + public class ConvertExpression : TestBase + { + [Test] + public void Select1() + { + ForEachProvider(db => AreEqual( + from p in Parent + let children = p.Children.Where(c => c.ParentID > 1) + select children.Sum(c => c.ChildID), + from p in db.Parent + let children = p.Children.Where(c => c.ParentID > 1) + select children.Sum(c => c.ChildID))); + } + + [Test] + public void Select2() + { + ForEachProvider(db => AreEqual( + from p in Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + let children2 = children1.Where(c => c.ParentID < 10) + select children2.Sum(c => c.ChildID), + from p in db.Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + let children2 = children1.Where(c => c.ParentID < 10) + select children2.Sum(c => c.ChildID))); + } + + [Test] + public void Select3() + { + ForEachProvider(db => AreEqual( + Parent + .Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1) }) + .Select(t => new { children2 = t.children1.Where(c => c.ParentID < 10) }) + .Select(t => t.children2.Sum(c => c.ChildID)), + db.Parent + .Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1) }) + .Select(t => new { children2 = t.children1.Where(c => c.ParentID < 10) }) + .Select(t => t.children2.Sum(c => c.ChildID)))); + } + + [Test] + public void Select4() + { + ForEachProvider(db => AreEqual( + Parent + .Select(p => p.Children. Where(c => c.ParentID > 1)) + .Select(t => t.Where(c => c.ParentID < 10)) + .Select(t => t.Sum(c => c.ChildID)), + db.Parent + .Select(p => p.Children. Where(c => c.ParentID > 1)) + .Select(t => t.Where(c => c.ParentID < 10)) + .Select(t => t.Sum(c => c.ChildID)))); + } + + [Test] + public void Where1() + { + ForEachProvider(db => AreEqual( + from p in Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + let children2 = children1.Where(c => c.ParentID < 10) + where children1.Any() + select children2.Sum(c => c.ChildID), + from p in db.Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + let children2 = children1.Where(c => c.ParentID < 10) + where children1.Any() + select children2.Sum(c => c.ChildID))); + } + + [Test] + public void Where2() + { + ForEachProvider(db => AreEqual( + from p in Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + where children1.Any() + let children2 = children1.Where(c => c.ParentID < 10) + select children2.Sum(c => c.ChildID), + from p in db.Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + where children1.Any() + let children2 = children1.Where(c => c.ParentID < 10) + select children2.Sum(c => c.ChildID))); + } + + [Test] + public void Where3() + { + ForEachProvider(db => AreEqual( + from p in Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + let children2 = children1.Where(c => c.ParentID < 10) + where children2.Any() + select children2.Sum(c => c.ChildID), + from p in db.Parent + let children1 = p.Children.Where(c => c.ParentID > 1) + let children2 = children1.Where(c => c.ParentID < 10) + where children2.Any() + select children2.Sum(c => c.ChildID))); + } + + //[Test] + public void Where4() + { + ForEachProvider(db => AreEqual( + Parent + .Select(p => new { p, children1 = p.Children. Where(c => c.ParentID > 1) }) + .Where (t => t.children1.Any()), + db.Parent + .Select(p => new { p, children1 = p.Children. Where(c => c.ParentID > 1) }) + .Where (t => t.children1.Any()))); + } + + //[Test] + public void Where5() + { + ForEachProvider(db => AreEqual( + Parent + .Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1) }) + .Where (t => t.children1.Any()), + db.Parent + .Select(p => new { children1 = p.Children. Where(c => c.ParentID > 1) }) + .Where (t => t.children1.Any()))); + } + + //[Test] + public void Where6() + { + ForEachProvider(db => AreEqual( + Parent + .Select(p => p.Children. Where(c => c.ParentID > 1)) + .Where (t => t.Any()), + db.Parent + .Select(p => p.Children. Where(c => c.ParentID > 1)) + .Where (t => t.Any()))); + } + + [Test] + public void Any1() + { + ForEachProvider(db => Assert.AreEqual( + Parent + .Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) }) + .Any(p => p.children1.Any()), + db.Parent + .Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) }) + .Any(p => p.children1.Any()))); + } + + [Test] + public void Any2() + { + ForEachProvider(db => Assert.AreEqual( + Parent + .Select(p => p.Children.Where(c => c.ParentID > 1)) + .Any(p => p.Any()), + db.Parent + .Select(p => p.Children.Where(c => c.ParentID > 1)) + .Any(p => p.Any()))); + } + + [Test] + public void Any3() + { + ForEachProvider(db => Assert.AreEqual( + Parent + .Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) }) + .Where(p => p.children1.Any()) + .Any(), + db.Parent + .Select(p => new { p, children1 = p.Children.Where(c => c.ParentID > 1) }) + .Where(p => p.children1.Any()) + .Any())); + } + + //[Test] + public void Any4() + { + ForEachProvider(db => Assert.AreEqual( + Parent + .Select(p => new { children1 = p.Children.Where(c => c.ParentID > 1) }) + .Where(p => p.children1.Any()) + .Any(), + db.Parent + .Select(p => new { children1 = p.Children.Where(c => c.ParentID > 1) }) + .Where(p => p.children1.Any()) + .Any())); + } + + + [Test] + public void LetTest1([DataContexts(ProviderName.SqlCe, ProviderName.Informix, ProviderName.Sybase)] string context) + { + using (var db = GetDataContext(context)) + AreEqual( + from p in Parent + let ch = p.Children + where ch.FirstOrDefault() != null + select ch.FirstOrDefault().ParentID + , + from p in db.Parent + let ch = p.Children + where ch.FirstOrDefault() != null + select ch.FirstOrDefault().ParentID); + } + + [Test] + public void LetTest2() + { + ForEachProvider( + new[] { ProviderName.SqlCe, ProviderName.Informix, ProviderName.Sybase }, + db => AreEqual( + from p in Parent + let ch = p.Children + where ch.FirstOrDefault() != null + select p + , + from p in db.Parent + let ch = p.Children + where ch.FirstOrDefault() != null + select p)); + } + + [Test] + public void LetTest3() + { + ForEachProvider( + new[] { ProviderName.Informix, ProviderName.Sybase }, + db => AreEqual( + from p in Parent + let ch = Child + select ch.FirstOrDefault().ParentID + , + from p in db.Parent + let ch = db.Child + select ch.FirstOrDefault().ParentID)); + } + + [Test] + public void LetTest4() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + new[] { ProviderName.Informix, ProviderName.Sybase }, + db => AreEqual( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0), + First2 = ch2.FirstOrDefault() + } + , + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0), + First2 = ch2.FirstOrDefault() + })); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest5() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + new[] { ProviderName.Informix, ProviderName.Sybase }, + db => AreEqual( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0) == null ? 0 : ch2.FirstOrDefault(c => c.ParentID > 0).ParentID, + First2 = ch2.FirstOrDefault() + } + , + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0).ParentID, + First2 = ch2.FirstOrDefault() + })); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest6() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + //BLToolkit.Common.Configuration.Linq.GenerateExpressionTest = true; + + ForEachProvider( + new[] { ProviderName.Informix, ProviderName.Sybase }, + db => AreEqual( + ( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + p.ParentID, + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0) == null ? 0 : ch2.FirstOrDefault(c => c.ParentID > 0).ParentID, + First2 = ch2.FirstOrDefault() + } + ).Where(t => t.ParentID > 0) + , + ( + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + p.ParentID, + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0).ParentID, + First2 = ch2.FirstOrDefault() + } + ).Where(t => t.ParentID > 0))); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest7() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + new[] { ProviderName.Informix, ProviderName.Sybase }, + db => AreEqual( + ( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + p.ParentID, + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0) == null ? 0 : ch2.FirstOrDefault(c => c.ParentID > 0).ParentID, + First2 = ch2.FirstOrDefault() + } + ).Where(t => t.ParentID > 0).Take(5000) + , + ( + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + select new + { + p.ParentID, + Any = ch2.Any(), + Count = ch2.Count(), + First1 = ch2.FirstOrDefault(c => c.ParentID > 0).ParentID, + First2 = ch2.FirstOrDefault() + } + ).Where(t => t.ParentID > 0).Take(5000))); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest8() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + db => AreEqual( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + let ch3 = ch2.FirstOrDefault(c => c.ParentID > 0) + select new + { + First1 = ch3 == null ? 0 : ch3.ParentID, + Any = ch2.Any(), + Count = ch2.Count(), + First2 = ch2.FirstOrDefault() + } + , + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + let ch2 = ch1.Where(c => c.ChildID > -100) + let ch3 = ch2.FirstOrDefault(c => c.ParentID > 0) + select new + { + First1 = ch3 == null ? 0 : ch3.ParentID, + Any = ch2.Any(), + Count = ch2.Count(), + First2 = ch2.FirstOrDefault() + })); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest9() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + db => AreEqual( + ( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + select new + { + First = ch1.FirstOrDefault() + } + ).Take(10) + , + ( + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + select new + { + First = ch1.FirstOrDefault() + } + ).Take(10))); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest10() + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + ForEachProvider( + db => Assert.AreEqual( + ( + from p in Parent + let ch1 = Child.Where(c => c.ParentID == p.ParentID) + select new + { + First = ch1.FirstOrDefault() + } + ).Any() + , + ( + from p in db.Parent + let ch1 = db.Child.Where(c => c.ParentID == p.ParentID) + select new + { + First = ch1.FirstOrDefault() + } + ).Any())); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + + [Test] + public void LetTest11([DataContexts] string context) + { + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = true; + + using (var db = GetDataContext(context)) + AreEqual( + from p in Parent + let ch1 = Child.FirstOrDefault(c => c.ParentID > 0) + let ch2 = Child.Where(c => c.ChildID > -100) + select new + { + First1 = ch1 == null ? 0 : ch1.ParentID, + First2 = ch2.FirstOrDefault() + } + , + from p in db.Parent + let ch1 = db.Child.FirstOrDefault(c => c.ParentID > 0) + let ch2 = Child.Where(c => c.ChildID > -100) + select new + { + First1 = ch1 == null ? 0 : ch1.ParentID, + First2 = ch2.FirstOrDefault() + }); + + BLToolkit.Common.Configuration.Linq.AllowMultipleQuery = false; + } + } +}