Mercurial > pub > bltoolkit
comparison UnitTests/Linq/ExpressionsTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
| author | cin | 
|---|---|
| date | Thu, 27 Mar 2014 21:46:09 +0400 | 
| parents | |
| children | 
   comparison
  equal
  deleted
  inserted
  replaced
| -1:000000000000 | 0:f990fcb411a9 | 
|---|---|
| 1 using System; | |
| 2 using System.Linq; | |
| 3 using System.Linq.Expressions; | |
| 4 | |
| 5 using BLToolkit.Data.DataProvider; | |
| 6 using BLToolkit.Data.Linq; | |
| 7 | |
| 8 using NUnit.Framework; | |
| 9 | |
| 10 namespace Data.Linq | |
| 11 { | |
| 12 using Model; | |
| 13 | |
| 14 [TestFixture] | |
| 15 public class ExpressionsTest : TestBase | |
| 16 { | |
| 17 static int Count1(Parent p) { return p.Children.Count(c => c.ChildID > 0); } | |
| 18 | |
| 19 [Test] | |
| 20 public void MapMember1() | |
| 21 { | |
| 22 Expressions.MapMember<Parent,int>(p => Count1(p), p => p.Children.Count(c => c.ChildID > 0)); | |
| 23 | |
| 24 ForEachProvider(db => AreEqual(Parent.Select(p => Count1(p)), db.Parent.Select(p => Count1(p)))); | |
| 25 } | |
| 26 | |
| 27 static int Count2(Parent p, int id) { return p.Children.Count(c => c.ChildID > id); } | |
| 28 | |
| 29 [Test] | |
| 30 public void MapMember2() | |
| 31 { | |
| 32 Expressions.MapMember<Parent,int,int>((p,id) => Count2(p, id), (p, id) => p.Children.Count(c => c.ChildID > id)); | |
| 33 | |
| 34 ForEachProvider(db => AreEqual(Parent.Select(p => Count2(p, 1)), db.Parent.Select(p => Count2(p, 1)))); | |
| 35 } | |
| 36 | |
| 37 static int Count3(Parent p, int id) { return p.Children.Count(c => c.ChildID > id) + 2; } | |
| 38 | |
| 39 [Test] | |
| 40 public void MapMember3() | |
| 41 { | |
| 42 Expressions.MapMember<Parent,int,int>((p,id) => Count3(p, id), (p, id) => p.Children.Count(c => c.ChildID > id) + 2); | |
| 43 | |
| 44 var n = 2; | |
| 45 | |
| 46 ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual(Parent.Select(p => Count3(p, n)), db.Parent.Select(p => Count3(p, n)))); | |
| 47 } | |
| 48 | |
| 49 [MethodExpression("Count4Expression")] | |
| 50 static int Count4(Parent p, int id, int n) | |
| 51 { | |
| 52 return (_count4Expression ?? (_count4Expression = Count4Expression().Compile()))(p, id, n); | |
| 53 } | |
| 54 | |
| 55 static Func<Parent,int,int,int> _count4Expression; | |
| 56 | |
| 57 static Expression<Func<Parent,int,int,int>> Count4Expression() | |
| 58 { | |
| 59 return (p, id, n) => p.Children.Count(c => c.ChildID > id) + n; | |
| 60 } | |
| 61 | |
| 62 [Test] | |
| 63 public void MethodExpression4() | |
| 64 { | |
| 65 var n = 3; | |
| 66 | |
| 67 ForEachProvider(db => AreEqual( | |
| 68 Parent.Select(p => Count4(p, n, 4)), | |
| 69 db.Parent.Select(p => Count4(p, n, 4)))); | |
| 70 } | |
| 71 | |
| 72 [MethodExpression("Count5Expression")] | |
| 73 static int Count5(ITestDataContext db, Parent p, int n) | |
| 74 { | |
| 75 return (_count5Expression ?? (_count5Expression = Count5Expression().Compile()))(db, p, n); | |
| 76 } | |
| 77 | |
| 78 static Func<ITestDataContext,Parent,int,int> _count5Expression; | |
| 79 | |
| 80 static Expression<Func<ITestDataContext,Parent,int,int>> Count5Expression() | |
| 81 { | |
| 82 return (db, p, n) => Sql.AsSql(db.Child.Where(c => c.ParentID == p.ParentID).Count() + n); | |
| 83 } | |
| 84 | |
| 85 [Test] | |
| 86 public void MethodExpression5() | |
| 87 { | |
| 88 var n = 2; | |
| 89 | |
| 90 ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual( | |
| 91 Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count() + n), | |
| 92 db.Parent.Select(p => Count5(db, p, n)))); | |
| 93 } | |
| 94 | |
| 95 [MethodExpression("Count6Expression")] | |
| 96 static int Count6(Table<Child> c, Parent p) | |
| 97 { | |
| 98 return (_count6Expression ?? (_count6Expression = Count6Expression().Compile()))(c, p); | |
| 99 } | |
| 100 | |
| 101 static Func<Table<Child>,Parent,int> _count6Expression; | |
| 102 | |
| 103 static Expression<Func<Table<Child>,Parent,int>> Count6Expression() | |
| 104 { | |
| 105 return (ch, p) => ch.Where(c => c.ParentID == p.ParentID).Count(); | |
| 106 } | |
| 107 | |
| 108 [Test] | |
| 109 public void MethodExpression6() | |
| 110 { | |
| 111 ForEachProvider(db => AreEqual( | |
| 112 Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count()), | |
| 113 db.Parent.Select(p => Count6(db.Child, p)))); | |
| 114 } | |
| 115 | |
| 116 [MethodExpression("Count7Expression")] | |
| 117 static int Count7(Table<Child> ch, Parent p, int n) | |
| 118 { | |
| 119 return (_count7Expression ?? (_count7Expression = Count7Expression().Compile()))(ch, p, n); | |
| 120 } | |
| 121 | |
| 122 static Func<Table<Child>,Parent,int,int> _count7Expression; | |
| 123 | |
| 124 static Expression<Func<Table<Child>,Parent,int,int>> Count7Expression() | |
| 125 { | |
| 126 return (ch, p, n) => Sql.AsSql(ch.Where(c => c.ParentID == p.ParentID).Count() + n); | |
| 127 } | |
| 128 | |
| 129 [Test] | |
| 130 public void MethodExpression7() | |
| 131 { | |
| 132 var n = 2; | |
| 133 | |
| 134 ForEachProvider(new[] { ProviderName.SqlCe, ProviderName.Firebird }, db => AreEqual( | |
| 135 Parent.Select(p => Child.Where(c => c.ParentID == p.ParentID).Count() + n), | |
| 136 db.Parent.Select(p => Count7(db.Child, p, n)))); | |
| 137 } | |
| 138 | |
| 139 [MethodExpression("Expression8")] | |
| 140 static IQueryable<Parent> GetParent(ITestDataContext db, Child ch) | |
| 141 { | |
| 142 throw new InvalidOperationException(); | |
| 143 } | |
| 144 | |
| 145 static Expression<Func<ITestDataContext,Child,IQueryable<Parent>>> Expression8() | |
| 146 { | |
| 147 return (db,ch) => | |
| 148 from p in db.Parent | |
| 149 where p.ParentID == (int)Math.Floor(ch.ChildID / 10.0) | |
| 150 select p; | |
| 151 } | |
| 152 | |
| 153 [Test] | |
| 154 public void MethodExpression8() | |
| 155 { | |
| 156 ForEachProvider(db => AreEqual( | |
| 157 from ch in Child | |
| 158 from p in | |
| 159 from p in Parent | |
| 160 where p.ParentID == ch.ChildID / 10 | |
| 161 select p | |
| 162 where ch.ParentID == p.ParentID | |
| 163 select ch | |
| 164 , | |
| 165 from ch in db.Child | |
| 166 from p in GetParent(db, ch) | |
| 167 where ch.ParentID == p.ParentID | |
| 168 select ch)); | |
| 169 } | |
| 170 | |
| 171 [Test] | |
| 172 public void MethodExpression9() | |
| 173 { | |
| 174 using (var db = new TestDbManager()) | |
| 175 AreEqual( | |
| 176 from ch in Child | |
| 177 from p in | |
| 178 from p in Parent | |
| 179 where p.ParentID == ch.ChildID / 10 | |
| 180 select p | |
| 181 where ch.ParentID == p.ParentID | |
| 182 select ch | |
| 183 , | |
| 184 from ch in db.Child | |
| 185 from p in TestDbManager.GetParent9(db, ch) | |
| 186 where ch.ParentID == p.ParentID | |
| 187 select ch); | |
| 188 } | |
| 189 | |
| 190 [Test] | |
| 191 public void MethodExpression10() | |
| 192 { | |
| 193 using (var db = new TestDbManager()) | |
| 194 AreEqual( | |
| 195 from ch in Child | |
| 196 from p in | |
| 197 from p in Parent | |
| 198 where p.ParentID == ch.ChildID / 10 | |
| 199 select p | |
| 200 where ch.ParentID == p.ParentID | |
| 201 select ch | |
| 202 , | |
| 203 from ch in db.Child | |
| 204 from p in db.GetParent10(ch) | |
| 205 where ch.ParentID == p.ParentID | |
| 206 select ch); | |
| 207 } | |
| 208 | |
| 209 [MethodExpression("GetBoolExpression1")] | |
| 210 static bool GetBool1<T>(T obj) | |
| 211 { | |
| 212 throw new InvalidOperationException(); | |
| 213 } | |
| 214 | |
| 215 static Expression<Func<T,bool>> GetBoolExpression1<T>() | |
| 216 where T : class | |
| 217 { | |
| 218 return obj => obj != null; | |
| 219 } | |
| 220 | |
| 221 [Test] | |
| 222 public void TestGenerics1() | |
| 223 { | |
| 224 using (var db = new TestDbManager()) | |
| 225 { | |
| 226 var q = | |
| 227 from ch in db.Child | |
| 228 where GetBool1(ch.Parent) | |
| 229 select ch; | |
| 230 | |
| 231 q.ToList(); | |
| 232 } | |
| 233 } | |
| 234 | |
| 235 [MethodExpression("GetBoolExpression2_{0}")] | |
| 236 static bool GetBool2<T>(T obj) | |
| 237 { | |
| 238 throw new InvalidOperationException(); | |
| 239 } | |
| 240 | |
| 241 static Expression<Func<Parent,bool>> GetBoolExpression2_Parent() | |
| 242 { | |
| 243 return obj => obj != null; | |
| 244 } | |
| 245 | |
| 246 [Test] | |
| 247 public void TestGenerics2() | |
| 248 { | |
| 249 using (var db = new TestDbManager()) | |
| 250 { | |
| 251 var q = | |
| 252 from ch in db.Child | |
| 253 where GetBool2(ch.Parent) | |
| 254 select ch; | |
| 255 | |
| 256 q.ToList(); | |
| 257 } | |
| 258 } | |
| 259 | |
| 260 class TestClass<T> | |
| 261 { | |
| 262 [MethodExpression("GetBoolExpression3")] | |
| 263 public static bool GetBool3(Parent obj) | |
| 264 { | |
| 265 throw new InvalidOperationException(); | |
| 266 } | |
| 267 | |
| 268 static Expression<Func<Parent,bool>> GetBoolExpression3() | |
| 269 { | |
| 270 return obj => obj != null; | |
| 271 } | |
| 272 } | |
| 273 | |
| 274 [Test] | |
| 275 public void TestGenerics3() | |
| 276 { | |
| 277 using (var db = new TestDbManager()) | |
| 278 { | |
| 279 var q = | |
| 280 from ch in db.Child | |
| 281 where TestClass<int>.GetBool3(ch.Parent) | |
| 282 select ch; | |
| 283 | |
| 284 q.ToList(); | |
| 285 } | |
| 286 } | |
| 287 } | |
| 288 } | 
