Mercurial > pub > bltoolkit
diff UnitTests/Linq/ComplexTest.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/ComplexTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,434 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +using BLToolkit.Data.DataProvider; +using BLToolkit.DataAccess; +using BLToolkit.Mapping; + +using NUnit.Framework; + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class ComplexTest : TestBase + { + [Test] + public void Contains1() + { + var q1 = + from gc1 in GrandChild + join max in + from gch in GrandChild + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc1.GrandChildID equals max + select gc1; + + var expected = + from ch in Child + join p in Parent on ch.ParentID equals p.ParentID + join gc2 in q1 on p.ParentID equals gc2.ParentID into g + from gc3 in g.DefaultIfEmpty() + where gc3 == null || !new[] { 111, 222 }.Contains(gc3.GrandChildID.Value) + select new { p.ParentID, gc3 }; + + ForEachProvider(new [] { ProviderName.Firebird, ProviderName.Access }, db => + { + var q2 = + from gc1 in db.GrandChild + join max in + from gch in db.GrandChild + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc1.GrandChildID equals max + select gc1; + + var result = + from ch in db.Child + join p in db.Parent on ch.ParentID equals p.ParentID + join gc2 in q2 on p.ParentID equals gc2.ParentID into g + from gc3 in g.DefaultIfEmpty() + where gc3 == null || !new[] { 111, 222 }.Contains(gc3.GrandChildID.Value) + select new { p.ParentID, gc3 }; + + AreEqual(expected, result); + }); + } + + [Test] + public void Contains2() + { + var q1 = + from gc in GrandChild + join max in + from gch in GrandChild + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc.GrandChildID equals max + select gc; + + var expected = + from ch in Child + join p in Parent on ch.ParentID equals p.ParentID + join gc in q1 on p.ParentID equals gc.ParentID into g + from gc in g.DefaultIfEmpty() + where gc == null || gc.GrandChildID != 111 && gc.GrandChildID != 222 + select new + { + Parent = p, + GrandChildID = gc, + Value = GetValue(gc != null ? gc.ChildID : int.MaxValue) + }; + + ForEachProvider(new [] { ProviderName.Firebird, ProviderName.Access }, db => + { + var q2 = + from gc in db.GrandChild + join max in + from gch in db.GrandChild + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc.GrandChildID equals max + select gc; + + var result = + from ch in db.Child + join p in db.Parent on ch.ParentID equals p.ParentID + join gc in q2 on p.ParentID equals gc.ParentID into g + from gc in g.DefaultIfEmpty() + where gc == null || gc.GrandChildID != 111 && gc.GrandChildID != 222 + select new + { + Parent = p, + GrandChildID = gc, + Value = GetValue(gc != null ? gc.ChildID : int.MaxValue) + }; + + AreEqual(expected, result); + }); + } + + static int GetValue(int? value) + { + return value ?? 777; + } + + [Test] + public void Contains3() + { + var q1 = + from gc in GrandChild1 + join max in + from gch in GrandChild1 + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc.GrandChildID equals max + select gc; + + var expected = + from ch in Child + join p in Parent on ch.ParentID equals p.ParentID + join gc in q1 on p.ParentID equals gc.ParentID into g + from gc in g.DefaultIfEmpty() + where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) + select new { p.ParentID, gc }; + + ForEachProvider(new [] { ProviderName.SQLite, ProviderName.Access }, db => + { + var q2 = + from gc in db.GrandChild1 + join max in + from gch in db.GrandChild1 + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc.GrandChildID equals max + select gc; + + var result = + from ch in db.Child + join p in db.Parent on ch.ParentID equals p.ParentID + join gc in q2 on p.ParentID equals gc.ParentID into g + from gc in g.DefaultIfEmpty() + where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) + select new { p.ParentID, gc }; + + AreEqual(expected, result); + }); + } + + [Test] + public void Contains4() + { + var q1 = + from gc in GrandChild1 + join max in + from gch in GrandChild1 + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc.GrandChildID equals max + select gc; + + var expected = + from ch in Child + join gc in q1 on ch.Parent.ParentID equals gc.ParentID into g + from gc in g.DefaultIfEmpty() + where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) + select new { ch.Parent, gc }; + + ForEachProvider(new [] { ProviderName.SQLite, ProviderName.Access }, db => + { + var q2 = + from gc in db.GrandChild1 + join max in + from gch in db.GrandChild1 + group gch by gch.ChildID into g + select g.Max(c => c.GrandChildID) + on gc.GrandChildID equals max + select gc; + + var result = + from ch in db.Child + join gc in q2 on ch.Parent.ParentID equals gc.ParentID into g + from gc in g.DefaultIfEmpty() + where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) + select new { ch.Parent, gc }; + + AreEqual(expected, result); + }); + } + + [Test] + public void Join1() + { + var q1 = + from p in Parent + join c in Child on p.ParentID equals c.ParentID + join g in GrandChild on p.ParentID equals g.ParentID + select new { p, c, g }; + + var expected = + from x in q1 + where + ( + (x.c.ParentID == 2 || x.c.ParentID == 3) && x.g.ChildID != 21 && x.g.ChildID != 33 + ) || ( + x.g.ParentID == 3 && x.g.ChildID == 32 + ) || ( + x.g.ChildID == 11 + ) + select x; + + ForEachProvider(db => + { + var q2 = + from p in db.Parent + join c in db.Child on p.ParentID equals c.ParentID + join g in db.GrandChild on p.ParentID equals g.ParentID + select new { p, c, g }; + + var result = + from x in q2 + where + ( + (x.c.ParentID == 2 || x.c.ParentID == 3) && x.g.ChildID != 21 && x.g.ChildID != 33 + ) || ( + x.g.ParentID == 3 && x.g.ChildID == 32 + ) || ( + x.g.ChildID == 11 + ) + select x; + + AreEqual(expected, result); + }); + } + + public class MyObject + { + public Parent Parent; + public Child Child; + } + + IQueryable<MyObject> GetData(ITestDataContext db, int id) + { + var q = + from p in db.Parent + join c in db.Child on p.ParentID equals c.ChildID + where p.ParentID == id && c.ChildID > 0 + select new MyObject { Parent = p, Child = c }; + + return q; + } + + [Test] + public void Join2() + { + ForEachProvider(db => + { + var q = + from o in GetData(db, 1) + from g in o.Parent.GrandChildren + select new { o, g }; + + var list = q.ToList(); + }); + } + + [Test] + public void ExpressionTest1([IncludeDataContexts("Northwind")] string context) + { + Expression<Func<Northwind.Customer,bool>> pred1 = cust=>cust.Country=="UK"; + Expression<Func<Northwind.Customer,bool>> pred2 = cust=>cust.Country=="France"; + + var param = Expression.Parameter(typeof(Northwind.Customer), "x"); + var final = Expression.Lambda<Func<Northwind.Customer,bool>>( + Expression.OrElse( + Expression.Invoke(pred1, param), + Expression.Invoke(pred2, param) + ), param); + + using (var db = new NorthwindDB()) + { + var count = db.Customer.Count(final); + } + } + + [Test] + public void ExpressionTest2() + { + Expression<Func<Parent,bool>> pred1 = _=>_.ParentID == 1; + Expression<Func<Parent,bool>> pred2 = _=>_.Value1 == 1 || _.Value1 == null; + + var param = Expression.Parameter(typeof(Parent), "x"); + var final = Expression.Lambda<Func<Parent,bool>>( + Expression.AndAlso( + Expression.Invoke(pred1, param), + Expression.Invoke(pred2, param) + ), param); + + using (var db = new TestDbManager()) + { + Assert.AreEqual(1, db.Parent.Count(final)); + } + } + + #region IEnumerableTest + + public class Entity + { + public int Id { get; set; } + } + + public enum TestEntityType : byte { Type1, Type2 } + + [TableName("GrandChild")] + [MapField("GrandChildID", "Id")] + [MapField("ChildID", "InnerEnity.Id")] + [MapField("ParentID", "InnerEntityType")] + public class LookupEntity : Entity + { + public Entity InnerEnity { get; set; } + public TestEntityType InnerEntityType { get; set; } + } + + [TableName("GrandChild")] + [MapField("GrandChildID", "Id")] + [MapField("ChildID", "Owner.Id")] + [MapField("ParentID", "EntityType")] + public class TestEntityBase : Entity + { + public TestEntityType EntityType { get; set; } + public SuperAccount Owner { get; set; } + } + + public class TestEntity : TestEntityBase, IEnumerable<object> + { + #region IEnumerable<object> Members + + public IEnumerator<object> GetEnumerator() + { + throw new NotImplementedException(); + } + + #endregion + + #region IEnumerable Members + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + #endregion + } + + public class TestEntity2 : TestEntityBase + { + } + + public enum SuperAccountType { Client, Organization } + + [TableName("GrandChild")] + [MapField("GrandChildID", "Id")] + [MapField("ParentID", "Type")] + public class SuperAccount : Entity, IEnumerable<object> + { + public List<Entity> InnerAccounts { get; set; } + public SuperAccountType Type { get; set; } + + + #region IEnumerable<object> Members + + public IEnumerator<object> GetEnumerator() + { + throw new NotImplementedException(); + } + + #endregion + + #region IEnumerable Members + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + #endregion + } + + [Test] + public void IEnumerableTest1() + { + using (var db = new TestDbManager()) + { + var res = + from rc in db.GetTable<TestEntity>() + join li in db.GetTable<LookupEntity>() on rc.Id equals li.InnerEnity.Id + where rc.EntityType == TestEntityType.Type1 + select rc; + + res.ToList(); + } + } + + [Test] + public void IEnumerableTest2() + { + using (var db = new TestDbManager()) + { + var zones = + from z in db.GetTable<TestEntity2>() + join o in db.GetTable<SuperAccount>() on z.Owner.Id equals o.Id + select z; + + zones.ToList(); + } + } + + #endregion + } +}