Mercurial > pub > bltoolkit
comparison UnitTests/Linq/ComplexTest.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.Collections; | |
3 using System.Collections.Generic; | |
4 using System.Linq; | |
5 using System.Linq.Expressions; | |
6 | |
7 using BLToolkit.Data.DataProvider; | |
8 using BLToolkit.DataAccess; | |
9 using BLToolkit.Mapping; | |
10 | |
11 using NUnit.Framework; | |
12 | |
13 namespace Data.Linq | |
14 { | |
15 using Model; | |
16 | |
17 [TestFixture] | |
18 public class ComplexTest : TestBase | |
19 { | |
20 [Test] | |
21 public void Contains1() | |
22 { | |
23 var q1 = | |
24 from gc1 in GrandChild | |
25 join max in | |
26 from gch in GrandChild | |
27 group gch by gch.ChildID into g | |
28 select g.Max(c => c.GrandChildID) | |
29 on gc1.GrandChildID equals max | |
30 select gc1; | |
31 | |
32 var expected = | |
33 from ch in Child | |
34 join p in Parent on ch.ParentID equals p.ParentID | |
35 join gc2 in q1 on p.ParentID equals gc2.ParentID into g | |
36 from gc3 in g.DefaultIfEmpty() | |
37 where gc3 == null || !new[] { 111, 222 }.Contains(gc3.GrandChildID.Value) | |
38 select new { p.ParentID, gc3 }; | |
39 | |
40 ForEachProvider(new [] { ProviderName.Firebird, ProviderName.Access }, db => | |
41 { | |
42 var q2 = | |
43 from gc1 in db.GrandChild | |
44 join max in | |
45 from gch in db.GrandChild | |
46 group gch by gch.ChildID into g | |
47 select g.Max(c => c.GrandChildID) | |
48 on gc1.GrandChildID equals max | |
49 select gc1; | |
50 | |
51 var result = | |
52 from ch in db.Child | |
53 join p in db.Parent on ch.ParentID equals p.ParentID | |
54 join gc2 in q2 on p.ParentID equals gc2.ParentID into g | |
55 from gc3 in g.DefaultIfEmpty() | |
56 where gc3 == null || !new[] { 111, 222 }.Contains(gc3.GrandChildID.Value) | |
57 select new { p.ParentID, gc3 }; | |
58 | |
59 AreEqual(expected, result); | |
60 }); | |
61 } | |
62 | |
63 [Test] | |
64 public void Contains2() | |
65 { | |
66 var q1 = | |
67 from gc in GrandChild | |
68 join max in | |
69 from gch in GrandChild | |
70 group gch by gch.ChildID into g | |
71 select g.Max(c => c.GrandChildID) | |
72 on gc.GrandChildID equals max | |
73 select gc; | |
74 | |
75 var expected = | |
76 from ch in Child | |
77 join p in Parent on ch.ParentID equals p.ParentID | |
78 join gc in q1 on p.ParentID equals gc.ParentID into g | |
79 from gc in g.DefaultIfEmpty() | |
80 where gc == null || gc.GrandChildID != 111 && gc.GrandChildID != 222 | |
81 select new | |
82 { | |
83 Parent = p, | |
84 GrandChildID = gc, | |
85 Value = GetValue(gc != null ? gc.ChildID : int.MaxValue) | |
86 }; | |
87 | |
88 ForEachProvider(new [] { ProviderName.Firebird, ProviderName.Access }, db => | |
89 { | |
90 var q2 = | |
91 from gc in db.GrandChild | |
92 join max in | |
93 from gch in db.GrandChild | |
94 group gch by gch.ChildID into g | |
95 select g.Max(c => c.GrandChildID) | |
96 on gc.GrandChildID equals max | |
97 select gc; | |
98 | |
99 var result = | |
100 from ch in db.Child | |
101 join p in db.Parent on ch.ParentID equals p.ParentID | |
102 join gc in q2 on p.ParentID equals gc.ParentID into g | |
103 from gc in g.DefaultIfEmpty() | |
104 where gc == null || gc.GrandChildID != 111 && gc.GrandChildID != 222 | |
105 select new | |
106 { | |
107 Parent = p, | |
108 GrandChildID = gc, | |
109 Value = GetValue(gc != null ? gc.ChildID : int.MaxValue) | |
110 }; | |
111 | |
112 AreEqual(expected, result); | |
113 }); | |
114 } | |
115 | |
116 static int GetValue(int? value) | |
117 { | |
118 return value ?? 777; | |
119 } | |
120 | |
121 [Test] | |
122 public void Contains3() | |
123 { | |
124 var q1 = | |
125 from gc in GrandChild1 | |
126 join max in | |
127 from gch in GrandChild1 | |
128 group gch by gch.ChildID into g | |
129 select g.Max(c => c.GrandChildID) | |
130 on gc.GrandChildID equals max | |
131 select gc; | |
132 | |
133 var expected = | |
134 from ch in Child | |
135 join p in Parent on ch.ParentID equals p.ParentID | |
136 join gc in q1 on p.ParentID equals gc.ParentID into g | |
137 from gc in g.DefaultIfEmpty() | |
138 where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) | |
139 select new { p.ParentID, gc }; | |
140 | |
141 ForEachProvider(new [] { ProviderName.SQLite, ProviderName.Access }, db => | |
142 { | |
143 var q2 = | |
144 from gc in db.GrandChild1 | |
145 join max in | |
146 from gch in db.GrandChild1 | |
147 group gch by gch.ChildID into g | |
148 select g.Max(c => c.GrandChildID) | |
149 on gc.GrandChildID equals max | |
150 select gc; | |
151 | |
152 var result = | |
153 from ch in db.Child | |
154 join p in db.Parent on ch.ParentID equals p.ParentID | |
155 join gc in q2 on p.ParentID equals gc.ParentID into g | |
156 from gc in g.DefaultIfEmpty() | |
157 where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) | |
158 select new { p.ParentID, gc }; | |
159 | |
160 AreEqual(expected, result); | |
161 }); | |
162 } | |
163 | |
164 [Test] | |
165 public void Contains4() | |
166 { | |
167 var q1 = | |
168 from gc in GrandChild1 | |
169 join max in | |
170 from gch in GrandChild1 | |
171 group gch by gch.ChildID into g | |
172 select g.Max(c => c.GrandChildID) | |
173 on gc.GrandChildID equals max | |
174 select gc; | |
175 | |
176 var expected = | |
177 from ch in Child | |
178 join gc in q1 on ch.Parent.ParentID equals gc.ParentID into g | |
179 from gc in g.DefaultIfEmpty() | |
180 where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) | |
181 select new { ch.Parent, gc }; | |
182 | |
183 ForEachProvider(new [] { ProviderName.SQLite, ProviderName.Access }, db => | |
184 { | |
185 var q2 = | |
186 from gc in db.GrandChild1 | |
187 join max in | |
188 from gch in db.GrandChild1 | |
189 group gch by gch.ChildID into g | |
190 select g.Max(c => c.GrandChildID) | |
191 on gc.GrandChildID equals max | |
192 select gc; | |
193 | |
194 var result = | |
195 from ch in db.Child | |
196 join gc in q2 on ch.Parent.ParentID equals gc.ParentID into g | |
197 from gc in g.DefaultIfEmpty() | |
198 where gc == null || !new[] { 111, 222 }.Contains(gc.GrandChildID.Value) | |
199 select new { ch.Parent, gc }; | |
200 | |
201 AreEqual(expected, result); | |
202 }); | |
203 } | |
204 | |
205 [Test] | |
206 public void Join1() | |
207 { | |
208 var q1 = | |
209 from p in Parent | |
210 join c in Child on p.ParentID equals c.ParentID | |
211 join g in GrandChild on p.ParentID equals g.ParentID | |
212 select new { p, c, g }; | |
213 | |
214 var expected = | |
215 from x in q1 | |
216 where | |
217 ( | |
218 (x.c.ParentID == 2 || x.c.ParentID == 3) && x.g.ChildID != 21 && x.g.ChildID != 33 | |
219 ) || ( | |
220 x.g.ParentID == 3 && x.g.ChildID == 32 | |
221 ) || ( | |
222 x.g.ChildID == 11 | |
223 ) | |
224 select x; | |
225 | |
226 ForEachProvider(db => | |
227 { | |
228 var q2 = | |
229 from p in db.Parent | |
230 join c in db.Child on p.ParentID equals c.ParentID | |
231 join g in db.GrandChild on p.ParentID equals g.ParentID | |
232 select new { p, c, g }; | |
233 | |
234 var result = | |
235 from x in q2 | |
236 where | |
237 ( | |
238 (x.c.ParentID == 2 || x.c.ParentID == 3) && x.g.ChildID != 21 && x.g.ChildID != 33 | |
239 ) || ( | |
240 x.g.ParentID == 3 && x.g.ChildID == 32 | |
241 ) || ( | |
242 x.g.ChildID == 11 | |
243 ) | |
244 select x; | |
245 | |
246 AreEqual(expected, result); | |
247 }); | |
248 } | |
249 | |
250 public class MyObject | |
251 { | |
252 public Parent Parent; | |
253 public Child Child; | |
254 } | |
255 | |
256 IQueryable<MyObject> GetData(ITestDataContext db, int id) | |
257 { | |
258 var q = | |
259 from p in db.Parent | |
260 join c in db.Child on p.ParentID equals c.ChildID | |
261 where p.ParentID == id && c.ChildID > 0 | |
262 select new MyObject { Parent = p, Child = c }; | |
263 | |
264 return q; | |
265 } | |
266 | |
267 [Test] | |
268 public void Join2() | |
269 { | |
270 ForEachProvider(db => | |
271 { | |
272 var q = | |
273 from o in GetData(db, 1) | |
274 from g in o.Parent.GrandChildren | |
275 select new { o, g }; | |
276 | |
277 var list = q.ToList(); | |
278 }); | |
279 } | |
280 | |
281 [Test] | |
282 public void ExpressionTest1([IncludeDataContexts("Northwind")] string context) | |
283 { | |
284 Expression<Func<Northwind.Customer,bool>> pred1 = cust=>cust.Country=="UK"; | |
285 Expression<Func<Northwind.Customer,bool>> pred2 = cust=>cust.Country=="France"; | |
286 | |
287 var param = Expression.Parameter(typeof(Northwind.Customer), "x"); | |
288 var final = Expression.Lambda<Func<Northwind.Customer,bool>>( | |
289 Expression.OrElse( | |
290 Expression.Invoke(pred1, param), | |
291 Expression.Invoke(pred2, param) | |
292 ), param); | |
293 | |
294 using (var db = new NorthwindDB()) | |
295 { | |
296 var count = db.Customer.Count(final); | |
297 } | |
298 } | |
299 | |
300 [Test] | |
301 public void ExpressionTest2() | |
302 { | |
303 Expression<Func<Parent,bool>> pred1 = _=>_.ParentID == 1; | |
304 Expression<Func<Parent,bool>> pred2 = _=>_.Value1 == 1 || _.Value1 == null; | |
305 | |
306 var param = Expression.Parameter(typeof(Parent), "x"); | |
307 var final = Expression.Lambda<Func<Parent,bool>>( | |
308 Expression.AndAlso( | |
309 Expression.Invoke(pred1, param), | |
310 Expression.Invoke(pred2, param) | |
311 ), param); | |
312 | |
313 using (var db = new TestDbManager()) | |
314 { | |
315 Assert.AreEqual(1, db.Parent.Count(final)); | |
316 } | |
317 } | |
318 | |
319 #region IEnumerableTest | |
320 | |
321 public class Entity | |
322 { | |
323 public int Id { get; set; } | |
324 } | |
325 | |
326 public enum TestEntityType : byte { Type1, Type2 } | |
327 | |
328 [TableName("GrandChild")] | |
329 [MapField("GrandChildID", "Id")] | |
330 [MapField("ChildID", "InnerEnity.Id")] | |
331 [MapField("ParentID", "InnerEntityType")] | |
332 public class LookupEntity : Entity | |
333 { | |
334 public Entity InnerEnity { get; set; } | |
335 public TestEntityType InnerEntityType { get; set; } | |
336 } | |
337 | |
338 [TableName("GrandChild")] | |
339 [MapField("GrandChildID", "Id")] | |
340 [MapField("ChildID", "Owner.Id")] | |
341 [MapField("ParentID", "EntityType")] | |
342 public class TestEntityBase : Entity | |
343 { | |
344 public TestEntityType EntityType { get; set; } | |
345 public SuperAccount Owner { get; set; } | |
346 } | |
347 | |
348 public class TestEntity : TestEntityBase, IEnumerable<object> | |
349 { | |
350 #region IEnumerable<object> Members | |
351 | |
352 public IEnumerator<object> GetEnumerator() | |
353 { | |
354 throw new NotImplementedException(); | |
355 } | |
356 | |
357 #endregion | |
358 | |
359 #region IEnumerable Members | |
360 | |
361 IEnumerator IEnumerable.GetEnumerator() | |
362 { | |
363 throw new NotImplementedException(); | |
364 } | |
365 | |
366 #endregion | |
367 } | |
368 | |
369 public class TestEntity2 : TestEntityBase | |
370 { | |
371 } | |
372 | |
373 public enum SuperAccountType { Client, Organization } | |
374 | |
375 [TableName("GrandChild")] | |
376 [MapField("GrandChildID", "Id")] | |
377 [MapField("ParentID", "Type")] | |
378 public class SuperAccount : Entity, IEnumerable<object> | |
379 { | |
380 public List<Entity> InnerAccounts { get; set; } | |
381 public SuperAccountType Type { get; set; } | |
382 | |
383 | |
384 #region IEnumerable<object> Members | |
385 | |
386 public IEnumerator<object> GetEnumerator() | |
387 { | |
388 throw new NotImplementedException(); | |
389 } | |
390 | |
391 #endregion | |
392 | |
393 #region IEnumerable Members | |
394 | |
395 IEnumerator IEnumerable.GetEnumerator() | |
396 { | |
397 throw new NotImplementedException(); | |
398 } | |
399 | |
400 #endregion | |
401 } | |
402 | |
403 [Test] | |
404 public void IEnumerableTest1() | |
405 { | |
406 using (var db = new TestDbManager()) | |
407 { | |
408 var res = | |
409 from rc in db.GetTable<TestEntity>() | |
410 join li in db.GetTable<LookupEntity>() on rc.Id equals li.InnerEnity.Id | |
411 where rc.EntityType == TestEntityType.Type1 | |
412 select rc; | |
413 | |
414 res.ToList(); | |
415 } | |
416 } | |
417 | |
418 [Test] | |
419 public void IEnumerableTest2() | |
420 { | |
421 using (var db = new TestDbManager()) | |
422 { | |
423 var zones = | |
424 from z in db.GetTable<TestEntity2>() | |
425 join o in db.GetTable<SuperAccount>() on z.Owner.Id equals o.Id | |
426 select z; | |
427 | |
428 zones.ToList(); | |
429 } | |
430 } | |
431 | |
432 #endregion | |
433 } | |
434 } |