System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact ccfb143ac892a3e77e86b15ebc4b47fddb948cc1:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 0d 0a 20  soft.com).. *.. 
00b0: 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74 68  * Released to th
00c0: 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e 2c  e public domain,
00d0: 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77 6e   use at your own
00e0: 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a 2a   risk!.. *******
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2f 0d 0a 0d 0a 75 73 69 6e 67 20 53 79 73 74  */....using Syst
0130: 65 6d 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65  em;..using Syste
0140: 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f 6e 3b 0d 0a  m.Data.Common;..
0150: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61  using System.Dia
0160: 67 6e 6f 73 74 69 63 73 3b 0d 0a 75 73 69 6e 67  gnostics;..using
0170: 20 53 79 73 74 65 6d 2e 4c 69 6e 71 3b 0d 0a 75   System.Linq;..u
0180: 73 69 6e 67 20 53 79 73 74 65 6d 2e 52 65 66 6c  sing System.Refl
0190: 65 63 74 69 6f 6e 3b 0d 0a 75 73 69 6e 67 20 53  ection;..using S
01a0: 79 73 74 65 6d 2e 54 65 78 74 3b 0d 0a 75 73 69  ystem.Text;..usi
01b0: 6e 67 20 53 79 73 74 65 6d 2e 54 72 61 6e 73 61  ng System.Transa
01c0: 63 74 69 6f 6e 73 3b 0d 0a 0d 0a 23 69 66 20 55  ctions;....#if U
01d0: 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45 57  SE_ENTITY_FRAMEW
01e0: 4f 52 4b 5f 36 0d 0a 75 73 69 6e 67 20 53 79 73  ORK_6..using Sys
01f0: 74 65 6d 2e 44 61 74 61 2e 45 6e 74 69 74 79 2e  tem.Data.Entity.
0200: 43 6f 72 65 2e 45 6e 74 69 74 79 43 6c 69 65 6e  Core.EntityClien
0210: 74 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d  t;..using System
0220: 2e 44 61 74 61 2e 45 6e 74 69 74 79 2e 43 6f 72  .Data.Entity.Cor
0230: 65 2e 4f 62 6a 65 63 74 73 3b 0d 0a 23 65 6c 73  e.Objects;..#els
0240: 65 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e  e..using System.
0250: 44 61 74 61 2e 45 6e 74 69 74 79 43 6c 69 65 6e  Data.EntityClien
0260: 74 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d  t;..using System
0270: 2e 44 61 74 61 2e 4f 62 6a 65 63 74 73 3b 0d 0a  .Data.Objects;..
0280: 23 65 6e 64 69 66 0d 0a 0d 0a 6e 61 6d 65 73 70  #endif....namesp
0290: 61 63 65 20 74 65 73 74 6c 69 6e 71 0d 0a 7b 0d  ace testlinq..{.
02a0: 0a 20 20 63 6c 61 73 73 20 50 72 6f 67 72 61 6d  .  class Program
02b0: 0d 0a 20 20 7b 0d 0a 20 20 20 20 20 20 70 72 69  ..  {..      pri
02c0: 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20  vate static int 
02d0: 4d 61 69 6e 28 73 74 72 69 6e 67 5b 5d 20 61 72  Main(string[] ar
02e0: 67 73 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  gs)..      {..  
02f0: 20 20 20 20 20 20 20 20 69 66 20 28 45 6e 76 69          if (Envi
0300: 72 6f 6e 6d 65 6e 74 2e 47 65 74 45 6e 76 69 72  ronment.GetEnvir
0310: 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 28 22  onmentVariable("
0320: 42 52 45 41 4b 22 29 20 21 3d 20 6e 75 6c 6c 29  BREAK") != null)
0330: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e               Con
0350: 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 0d  sole.WriteLine(.
0360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0370: 20 20 20 22 41 74 74 61 63 68 20 61 20 64 65 62     "Attach a deb
0380: 75 67 67 65 72 20 74 6f 20 70 72 6f 63 65 73 73  ugger to process
0390: 20 7b 30 7d 20 61 6e 64 20 70 72 65 73 73 20 61   {0} and press a
03a0: 6e 79 20 6b 65 79 20 74 6f 20 63 6f 6e 74 69 6e  ny key to contin
03b0: 75 65 2e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ue.",..         
03c0: 20 20 20 20 20 20 20 20 20 50 72 6f 63 65 73 73           Process
03d0: 2e 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  .GetCurrentProce
03e0: 73 73 28 29 2e 49 64 29 3b 0d 0a 0d 0a 20 20 20  ss().Id);....   
03f0: 20 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a             try..
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
0410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0420: 20 20 20 43 6f 6e 73 6f 6c 65 2e 52 65 61 64 4b     Console.ReadK
0430: 65 79 28 74 72 75 65 29 3b 20 2f 2a 20 74 68 72  ey(true); /* thr
0440: 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  ow */..         
0450: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
0460: 20 20 20 20 20 20 63 61 74 63 68 20 28 49 6e 76        catch (Inv
0470: 61 6c 69 64 4f 70 65 72 61 74 69 6f 6e 45 78 63  alidOperationExc
0480: 65 70 74 69 6f 6e 29 20 2f 2f 20 43 6f 6e 73 6f  eption) // Conso
0490: 6c 65 2e 52 65 61 64 4b 65 79 0d 0a 20 20 20 20  le.ReadKey..    
04a0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
04b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
04c0: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
04e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
04f0: 44 65 62 75 67 67 65 72 2e 42 72 65 61 6b 28 29  Debugger.Break()
0500: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
0510: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69  ..          stri
0520: 6e 67 20 61 72 67 20 3d 20 6e 75 6c 6c 3b 0d 0a  ng arg = null;..
0530: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28  ..          if (
0540: 28 61 72 67 73 20 21 3d 20 6e 75 6c 6c 29 20 26  (args != null) &
0550: 26 20 28 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e  & (args.Length >
0560: 20 30 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20   0))..          
0570: 20 20 20 20 61 72 67 20 3d 20 61 72 67 73 5b 30      arg = args[0
0580: 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ];....          
0590: 69 66 20 28 61 72 67 20 3d 3d 20 6e 75 6c 6c 29  if (arg == null)
05a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
05b0: 61 72 67 20 3d 20 22 22 3b 0d 0a 0d 0a 20 20 20  arg = "";....   
05c0: 20 20 20 20 20 20 20 61 72 67 20 3d 20 61 72 67         arg = arg
05d0: 2e 54 72 69 6d 28 29 2e 54 72 69 6d 53 74 61 72  .Trim().TrimStar
05e0: 74 28 27 2d 27 2c 20 27 2f 27 29 2e 54 6f 4c 6f  t('-', '/').ToLo
05f0: 77 65 72 49 6e 76 61 72 69 61 6e 74 28 29 3b 0d  werInvariant();.
0600: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 73 77 69  ...          swi
0610: 74 63 68 20 28 61 72 67 29 0d 0a 20 20 20 20 20  tch (arg)..     
0620: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0630: 20 20 20 20 20 20 63 61 73 65 20 22 22 3a 20 2f        case "": /
0640: 2f 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 0d 0a  / String.Empty..
0650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
0660: 73 65 20 22 6f 6c 64 22 3a 0d 0a 20 20 20 20 20  se "old":..     
0670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 6c 64        return Old
06a0: 54 65 73 74 73 28 29 3b 0d 0a 20 20 20 20 20 20  Tests();..      
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
06d0: 65 20 22 64 61 74 65 74 69 6d 65 22 3a 0d 0a 20  e "datetime":.. 
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0700: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0710: 20 44 61 74 65 54 69 6d 65 54 65 73 74 28 29 3b   DateTimeTest();
0720: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0730: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
0740: 20 20 20 20 20 63 61 73 65 20 22 64 61 74 65 74       case "datet
0750: 69 6d 65 32 22 3a 0d 0a 20 20 20 20 20 20 20 20  ime2":..        
0760: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0780: 20 20 20 73 74 72 69 6e 67 20 64 61 74 65 54 69     string dateTi
0790: 6d 65 46 6f 72 6d 61 74 20 3d 20 6e 75 6c 6c 3b  meFormat = null;
07a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
07b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72            if (ar
07c0: 67 73 2e 4c 65 6e 67 74 68 20 3e 20 31 29 0d 0a  gs.Length > 1)..
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 20 20 64 61 74 65 54 69            dateTi
07f0: 6d 65 46 6f 72 6d 61 74 20 3d 20 61 72 67 73 5b  meFormat = args[
0800: 31 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  1];....         
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 61 74               Dat
0820: 65 54 69 6d 65 54 65 73 74 32 28 64 61 74 65 54  eTimeTest2(dateT
0830: 69 6d 65 46 6f 72 6d 61 74 29 3b 0d 0a 20 20 20  imeFormat);..   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20     return 0;..  
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
0880: 20 63 61 73 65 20 22 73 6b 69 70 22 3a 0d 0a 20   case "skip":.. 
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
08b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 61            int pa
08c0: 67 65 53 69 7a 65 20 3d 20 30 3b 0d 0a 0d 0a 20  geSize = 0;.... 
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 20 20 69 66 20 28 61 72 67 73 2e 4c 65       if (args.Le
08f0: 6e 67 74 68 20 3e 20 31 29 0d 0a 20 20 20 20 20  ngth > 1)..     
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72                ar
0930: 67 20 3d 20 61 72 67 73 5b 31 5d 3b 0d 0a 0d 0a  g = args[1];....
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 72            if (ar
0960: 67 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  g != null)..    
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
0990: 7a 65 20 3d 20 69 6e 74 2e 50 61 72 73 65 28 61  ze = int.Parse(a
09a0: 72 67 2e 54 72 69 6d 28 29 29 3b 0d 0a 20 20 20  rg.Trim());..   
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
09e0: 74 75 72 6e 20 53 6b 69 70 54 65 73 74 28 70 61  turn SkipTest(pa
09f0: 67 65 53 69 7a 65 29 3b 0d 0a 20 20 20 20 20 20  geSize);..      
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
0a20: 65 20 22 75 6e 69 6f 6e 61 6c 6c 22 3a 0d 0a 20  e "unionall":.. 
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0a50: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0a60: 20 55 6e 69 6f 6e 41 6c 6c 54 65 73 74 28 29 3b   UnionAllTest();
0a70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0a80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
0a90: 20 20 20 20 20 63 61 73 65 20 22 65 6e 64 73 77       case "endsw
0aa0: 69 74 68 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  ith":..         
0ab0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 73 74 72 69 6e 67 20 76 61 6c 75 65 20 3d    string value =
0ae0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 69 66 20 28 61 72 67 73 2e 4c 65 6e 67 74 68 20  if (args.Length 
0b10: 3e 20 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20  > 1)..          
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 3d           value =
0b50: 20 61 72 67 73 5b 31 5d 3b 0d 0a 0d 0a 20 20 20   args[1];....   
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
0b80: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 3d           value =
0bb0: 20 76 61 6c 75 65 2e 54 72 69 6d 28 29 3b 0d 0a   value.Trim();..
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 72 65 74 75 72 6e 20 45 6e 64 73 57 69 74 68   return EndsWith
0c00: 54 65 73 74 28 76 61 6c 75 65 29 3b 0d 0a 20 20  Test(value);..  
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
0c30: 20 63 61 73 65 20 22 73 74 61 72 74 73 77 69 74   case "startswit
0c40: 68 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h":..           
0c50: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 73 74 72 69 6e 67 20 76 61 6c 75 65 20 3d 20 6e  string value = n
0c80: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
0ca0: 20 28 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e 20   (args.Length > 
0cb0: 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  1)..            
0cc0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 61         value = a
0cf0: 72 67 73 5b 31 5d 3b 0d 0a 0d 0a 20 20 20 20 20  rgs[1];....     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20 21       if (value !
0d20: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 76         value = v
0d50: 61 6c 75 65 2e 54 72 69 6d 28 29 3b 0d 0a 20 20  alue.Trim();..  
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
0d90: 65 74 75 72 6e 20 53 74 61 72 74 73 57 69 74 68  eturn StartsWith
0da0: 54 65 73 74 28 76 61 6c 75 65 29 3b 0d 0a 20 20  Test(value);..  
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
0dd0: 20 63 61 73 65 20 22 65 66 74 72 61 6e 73 61 63   case "eftransac
0de0: 74 69 6f 6e 22 3a 0d 0a 20 20 20 20 20 20 20 20  tion":..        
0df0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 20 20 62 6f 6f 6c 20 76 61 6c 75 65 20 3d 20     bool value = 
0e20: 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 69 66 20 28 61 72 67 73 2e 4c 65 6e 67 74 68 20  if (args.Length 
0e50: 3e 20 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20  > 1)..          
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 62 6f           if (!bo
0e90: 6f 6c 2e 54 72 79 50 61 72 73 65 28 61 72 67 73  ol.TryParse(args
0ea0: 5b 31 5d 2c 20 6f 75 74 20 76 61 6c 75 65 29 29  [1], out value))
0eb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e               Con
0ef0: 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 0d  sole.WriteLine(.
0f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 20 20 22 63 61 6e 6e 6f 74 20 70 61 72 73 65     "cannot parse
0f30: 20 5c 22 7b 30 7d 5c 22 20 61 73 20 62 6f 6f 6c   \"{0}\" as bool
0f40: 65 61 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ean",..         
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 20 20 20 20 20 20 20 20 20 61 72 67 73 5b 31 5d           args[1]
0f70: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20      return 1;.. 
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
0ff0: 75 72 6e 20 45 46 54 72 61 6e 73 61 63 74 69 6f  urn EFTransactio
1000: 6e 54 65 73 74 28 76 61 6c 75 65 29 3b 0d 0a 20  nTest(value);.. 
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1030: 20 20 63 61 73 65 20 22 75 70 64 61 74 65 22 3a    case "update":
1040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1050: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1070: 75 72 6e 20 55 70 64 61 74 65 54 65 73 74 28 29  urn UpdateTest()
1080: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1090: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
10a0: 20 20 20 20 20 20 63 61 73 65 20 22 62 69 6e 61        case "bina
10b0: 72 79 67 75 69 64 22 3a 0d 0a 20 20 20 20 20 20  ryguid":..      
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 62 6f 6f 6c 20 76 61 6c 75 65 20       bool value 
10f0: 3d 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20  = false;....    
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 69 66 20 28 61 72 67 73 2e 4c 65 6e 67 74    if (args.Lengt
1120: 68 20 3e 20 31 29 0d 0a 20 20 20 20 20 20 20 20  h > 1)..        
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
1140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1150: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
1160: 62 6f 6f 6c 2e 54 72 79 50 61 72 73 65 28 61 72  bool.TryParse(ar
1170: 67 73 5b 31 5d 2c 20 6f 75 74 20 76 61 6c 75 65  gs[1], out value
1180: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
11a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
11c0: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
11d0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 70 61 72       "cannot par
1200: 73 65 20 5c 22 7b 30 7d 5c 22 20 61 73 20 62 6f  se \"{0}\" as bo
1210: 6f 6c 65 61 6e 22 2c 0d 0a 20 20 20 20 20 20 20  olean",..       
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73 5b             args[
1240: 31 5d 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  1]);....        
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0d        return 1;.
1270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1280: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12c0: 65 74 75 72 6e 20 42 69 6e 61 72 79 47 75 69 64  eturn BinaryGuid
12d0: 54 65 73 74 28 76 61 6c 75 65 29 3b 0d 0a 20 20  Test(value);..  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 7d 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c  }..#if NET_40 ||
1300: 20 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34   NET_45 || NET_4
1310: 35 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  51..            
1320: 20 20 63 61 73 65 20 22 62 69 6e 61 72 79 67 75    case "binarygu
1330: 69 64 32 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  id2":..         
1340: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 62 6f 6f 6c 20 76 61 6c 75 65 20 3d 20 66    bool value = f
1370: 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1390: 66 20 28 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e  f (args.Length >
13a0: 20 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   1)..           
13b0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 20 69 66 20 28 21 62 6f 6f          if (!boo
13e0: 6c 2e 54 72 79 50 61 72 73 65 28 61 72 67 73 5b  l.TryParse(args[
13f0: 31 5d 2c 20 6f 75 74 20 76 61 6c 75 65 29 29 0d  1], out value)).
1400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1410: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
1440: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 0d 0a  ole.WriteLine(..
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 22 63 61 6e 6e 6f 74 20 70 61 72 73 65 20    "cannot parse 
1480: 5c 22 7b 30 7d 5c 22 20 61 73 20 62 6f 6f 6c 65  \"{0}\" as boole
1490: 61 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  an",..          
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 61 72 67 73 5b 31 5d 29          args[1])
14c0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1530: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1540: 72 6e 20 42 69 6e 61 72 79 47 75 69 64 54 65 73  rn BinaryGuidTes
1550: 74 32 28 76 61 6c 75 65 29 3b 0d 0a 20 20 20 20  t2(value);..    
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1570: 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20  .#endif..       
1580: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0d         default:.
1590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15a0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
15c0: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 75  ole.WriteLine("u
15d0: 6e 6b 6e 6f 77 6e 20 74 65 73 74 20 5c 22 7b 30  nknown test \"{0
15e0: 7d 5c 22 22 2c 20 61 72 67 29 3b 0d 0a 20 20 20  }\"", arg);..   
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  }..          }..
1630: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1640: 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a   /// <summary>..
1650: 20 20 20 20 20 20 2f 2f 2f 20 41 74 74 65 6d 70        /// Attemp
1660: 74 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ts to obtain the
1670: 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
1680: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20  e connection..  
1690: 20 20 20 20 2f 2f 2f 20 28 61 20 3c 73 65 65 20      /// (a <see 
16a0: 63 72 65 66 3d 22 44 62 43 6f 6e 6e 65 63 74 69  cref="DbConnecti
16b0: 6f 6e 22 20 2f 3e 29 20 66 72 6f 6d 20 74 68 65  on" />) from the
16c0: 20 73 70 65 63 69 66 69 65 64 0d 0a 20 20 20 20   specified..    
16d0: 20 20 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d    /// <see cref=
16e0: 22 45 6e 74 69 74 79 43 6f 6e 6e 65 63 74 69 6f  "EntityConnectio
16f0: 6e 22 20 2f 3e 2e 0d 0a 20 20 20 20 20 20 2f 2f  n" />...      //
1700: 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  / </summary>..  
1710: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
1720: 61 6d 65 3d 22 65 6e 74 69 74 79 43 6f 6e 6e 65  ame="entityConne
1730: 63 74 69 6f 6e 22 3e 0d 0a 20 20 20 20 20 20 2f  ction">..      /
1740: 2f 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66  // The <see cref
1750: 3d 22 45 6e 74 69 74 79 43 6f 6e 6e 65 63 74 69  ="EntityConnecti
1760: 6f 6e 22 20 2f 3e 20 74 6f 20 75 73 65 2e 0d 0a  on" /> to use...
1770: 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61        /// </para
1780: 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72  m>..      /// <r
1790: 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f  eturns>..      /
17a0: 2f 2f 20 54 68 65 20 3c 73 65 65 20 63 72 65 66  // The <see cref
17b0: 3d 22 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 22 20  ="DbConnection" 
17c0: 2f 3e 20 2d 4f 52 2d 20 6e 75 6c 6c 20 69 66 20  /> -OR- null if 
17d0: 69 74 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 63 61  it..      /// ca
17e0: 6e 6e 6f 74 20 62 65 20 64 65 74 65 72 6d 69 6e  nnot be determin
17f0: 65 64 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  ed...      /// <
1800: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20  /returns>..     
1810: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1820: 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 20 47 65 74  DbConnection Get
1830: 53 74 6f 72 65 43 6f 6e 6e 65 63 74 69 6f 6e 28  StoreConnection(
1840: 0d 0a 20 20 20 20 20 20 20 20 20 20 45 6e 74 69  ..          Enti
1850: 74 79 43 6f 6e 6e 65 63 74 69 6f 6e 20 65 6e 74  tyConnection ent
1860: 69 74 79 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20  ityConnection.. 
1870: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
1880: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 2f    {..          /
1890: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  /..          // 
18a0: 4e 4f 54 45 3a 20 4e 6f 20 65 6e 74 69 74 79 20  NOTE: No entity 
18b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 6e 6f 20 73  connection, no s
18c0: 74 6f 72 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  tore connection.
18d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a  ..          //..
18e0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65 6e            if (en
18f0: 74 69 74 79 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d  tityConnection =
1900: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1910: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75         return nu
1920: 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ll;....         
1930: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 2f   //..          /
1940: 2f 20 48 41 43 4b 3a 20 57 65 20 6e 65 65 64 20  / HACK: We need 
1950: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  the underlying s
1960: 74 6f 72 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tore connection 
1970: 61 6e 64 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  and..          /
1980: 2f 20 20 20 20 20 20 20 74 68 65 20 6c 65 67 61  /       the lega
1990: 63 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  cy versions of t
19a0: 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72  he .NET Framewor
19b0: 6b 20 64 6f 0d 0a 20 20 20 20 20 20 20 20 20 20  k do..          
19c0: 2f 2f 20 20 20 20 20 20 20 6e 6f 74 20 65 78 70  //       not exp
19d0: 6f 73 65 20 69 74 3b 20 74 68 65 72 65 66 6f 72  ose it; therefor
19e0: 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 67 72  e, attempt to gr
19f0: 61 62 20 69 74 0d 0a 20 20 20 20 20 20 20 20 20  ab it..         
1a00: 20 2f 2f 20 20 20 20 20 20 20 62 79 20 66 6f 72   //       by for
1a10: 63 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 2f  ce...          /
1a20: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 46 69 65  /..          Fie
1a30: 6c 64 49 6e 66 6f 20 66 69 65 6c 64 49 6e 66 6f  ldInfo fieldInfo
1a40: 20 3d 20 74 79 70 65 6f 66 28 45 6e 74 69 74 79   = typeof(Entity
1a50: 43 6f 6e 6e 65 63 74 69 6f 6e 29 2e 47 65 74 46  Connection).GetF
1a60: 69 65 6c 64 28 0d 0a 20 20 20 20 20 20 20 20 20  ield(..         
1a70: 20 20 20 20 20 22 5f 73 74 6f 72 65 43 6f 6e 6e       "_storeConn
1a80: 65 63 74 69 6f 6e 22 2c 20 42 69 6e 64 69 6e 67  ection", Binding
1a90: 46 6c 61 67 73 2e 49 6e 73 74 61 6e 63 65 20 7c  Flags.Instance |
1aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ab0: 42 69 6e 64 69 6e 67 46 6c 61 67 73 2e 4e 6f 6e  BindingFlags.Non
1ac0: 50 75 62 6c 69 63 29 3b 0d 0a 0d 0a 20 20 20 20  Public);....    
1ad0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
1ae0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20      // NOTE: If 
1af0: 74 68 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 74  the field is not
1b00: 20 66 6f 75 6e 64 2c 20 6a 75 73 74 20 72 65 74   found, just ret
1b10: 75 72 6e 20 6e 75 6c 6c 2e 0d 0a 20 20 20 20 20  urn null...     
1b20: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
1b30: 20 20 20 69 66 20 28 66 69 65 6c 64 49 6e 66 6f     if (fieldInfo
1b40: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1b50: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b60: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
1b70: 20 20 20 72 65 74 75 72 6e 20 66 69 65 6c 64 49     return fieldI
1b80: 6e 66 6f 2e 47 65 74 56 61 6c 75 65 28 65 6e 74  nfo.GetValue(ent
1b90: 69 74 79 43 6f 6e 6e 65 63 74 69 6f 6e 29 20 61  ityConnection) a
1ba0: 73 20 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0d  s DbConnection;.
1bb0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1bc0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 2f 2f 20 4e    //..      // N
1bd0: 4f 54 45 3a 20 55 73 65 64 20 74 6f 20 74 65 73  OTE: Used to tes
1be0: 74 20 74 68 65 20 66 69 78 20 66 6f 72 20 74 69  t the fix for ti
1bf0: 63 6b 65 74 20 5b 38 62 37 64 31 37 39 63 33 63  cket [8b7d179c3c
1c00: 5d 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20  ]...      //..  
1c10: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1c20: 69 63 20 69 6e 74 20 53 6b 69 70 54 65 73 74 28  ic int SkipTest(
1c30: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 0d 0a 20  int pageSize).. 
1c40: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c50: 20 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69    using (northwi
1c60: 6e 64 45 46 45 6e 74 69 74 69 65 73 20 64 62 20  ndEFEntities db 
1c70: 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45  = new northwindE
1c80: 46 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20  FEntities())..  
1c90: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1ca0: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6f 6e           bool on
1cb0: 63 65 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20  ce = false;..   
1cc0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63             int c
1cd0: 6f 75 6e 74 20 3d 20 64 62 2e 43 75 73 74 6f 6d  ount = db.Custom
1ce0: 65 72 73 2e 43 6f 75 6e 74 28 29 3b 0d 0a 0d 0a  ers.Count();....
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d00: 74 20 50 61 67 65 43 6f 75 6e 74 20 3d 20 28 70  t PageCount = (p
1d10: 61 67 65 53 69 7a 65 20 21 3d 20 30 29 20 3f 0d  ageSize != 0) ?.
1d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d30: 20 20 20 28 63 6f 75 6e 74 20 2f 20 70 61 67 65     (count / page
1d40: 53 69 7a 65 29 20 2b 20 28 28 63 6f 75 6e 74 20  Size) + ((count 
1d50: 25 20 70 61 67 65 53 69 7a 65 29 20 3d 3d 20 30  % pageSize) == 0
1d60: 20 3f 20 30 20 3a 20 31 29 20 3a 20 31 3b 0d 0a   ? 0 : 1) : 1;..
1d70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1d80: 66 6f 72 20 28 69 6e 74 20 70 61 67 65 49 6e 64  for (int pageInd
1d90: 65 78 20 3d 20 30 3b 20 70 61 67 65 49 6e 64 65  ex = 0; pageInde
1da0: 78 20 3c 20 50 61 67 65 43 6f 75 6e 74 3b 20 70  x < PageCount; p
1db0: 61 67 65 49 6e 64 65 78 2b 2b 29 0d 0a 20 20 20  ageIndex++)..   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 76 61 72 20 71 75 65 72 79 20 3d 20 64 62 2e 43  var query = db.C
1df0: 75 73 74 6f 6d 65 72 73 2e 4f 72 64 65 72 42 79  ustomers.OrderBy
1e00: 28 70 20 3d 3e 20 70 2e 43 69 74 79 29 2e 0d 0a  (p => p.City)...
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 53 6b 69 70 28 70 61 67 65 53        Skip(pageS
1e30: 69 7a 65 20 2a 20 70 61 67 65 49 6e 64 65 78 29  ize * pageIndex)
1e40: 2e 54 61 6b 65 28 70 61 67 65 53 69 7a 65 29 3b  .Take(pageSize);
1e50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e60: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 43        foreach (C
1e70: 75 73 74 6f 6d 65 72 73 20 63 75 73 74 6f 6d 65  ustomers custome
1e80: 72 73 20 69 6e 20 71 75 65 72 79 29 0d 0a 20 20  rs in query)..  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1eb0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 6e 63           if (onc
1ec0: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
1ee0: 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27 20 27 29  nsole.Write(' ')
1ef0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1f00: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f             Conso
1f10: 6c 65 2e 57 72 69 74 65 28 63 75 73 74 6f 6d 65  le.Write(custome
1f20: 72 73 2e 43 75 73 74 6f 6d 65 72 49 44 29 3b 0d  rs.CustomerID);.
1f30: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1f40: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
1f50: 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
1f60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f70: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f80: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1f90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d        return 0;.
1fa0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
1fb0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 2f 2f 20 4e    //..      // N
1fc0: 4f 54 45 3a 20 55 73 65 64 20 74 6f 20 74 65 73  OTE: Used to tes
1fd0: 74 20 74 68 65 20 66 69 78 20 66 6f 72 20 74 69  t the fix for ti
1fe0: 63 6b 65 74 20 5b 35 39 65 64 63 31 30 31 38 62  cket [59edc1018b
1ff0: 5d 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20  ]...      //..  
2000: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
2010: 69 63 20 69 6e 74 20 45 6e 64 73 57 69 74 68 54  ic int EndsWithT
2020: 65 73 74 28 73 74 72 69 6e 67 20 76 61 6c 75 65  est(string value
2030: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
2040: 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72        using (nor
2050: 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73  thwindEFEntities
2060: 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77   db = new northw
2070: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29  indEFEntities())
2080: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
20a0: 6c 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65 3b 0d  l once = false;.
20b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
20c0: 61 72 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20  ar query = from 
20d0: 63 20 69 6e 20 64 62 2e 43 75 73 74 6f 6d 65 72  c in db.Customer
20e0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
2100: 72 65 20 63 2e 43 69 74 79 2e 45 6e 64 73 57 69  re c.City.EndsWi
2110: 74 68 28 76 61 6c 75 65 29 0d 0a 20 20 20 20 20  th(value)..     
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 20 20 20 20 20 6f 72 64 65 72 62 79 20 63 2e 43       orderby c.C
2140: 75 73 74 6f 6d 65 72 49 44 0d 0a 20 20 20 20 20  ustomerID..     
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 73 65 6c 65 63 74 20 63 3b 0d 0a       select c;..
2170: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2180: 66 6f 72 65 61 63 68 20 28 43 75 73 74 6f 6d 65  foreach (Custome
2190: 72 73 20 63 75 73 74 6f 6d 65 72 73 20 69 6e 20  rs customers in 
21a0: 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20 20  query)..        
21b0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
21c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f             if (o
21d0: 6e 63 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  nce)..          
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
21f0: 6f 6c 65 2e 57 72 69 74 65 28 27 20 27 29 3b 0d  ole.Write(' ');.
2200: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2210: 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69       Console.Wri
2220: 74 65 28 63 75 73 74 6f 6d 65 72 73 2e 43 75 73  te(customers.Cus
2230: 74 6f 6d 65 72 49 44 29 3b 0d 0a 0d 0a 20 20 20  tomerID);....   
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
2250: 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20  nce = true;..   
2260: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2270: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2280: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
2290: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
22a0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 2f 2f 20     //..      // 
22b0: 4e 4f 54 45 3a 20 55 73 65 64 20 74 6f 20 76 65  NOTE: Used to ve
22c0: 72 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  rify the behavio
22d0: 72 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 5b 30  r from ticket [0
22e0: 30 66 38 36 66 39 37 33 39 5d 2e 0d 0a 20 20 20  0f86f9739]...   
22f0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 70 72 69     //..      pri
2300: 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20  vate static int 
2310: 53 74 61 72 74 73 57 69 74 68 54 65 73 74 28 73  StartsWithTest(s
2320: 74 72 69 6e 67 20 76 61 6c 75 65 29 0d 0a 20 20  tring value)..  
2330: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2340: 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69 6e   using (northwin
2350: 64 45 46 45 6e 74 69 74 69 65 73 20 64 62 20 3d  dEFEntities db =
2360: 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45 46   new northwindEF
2370: 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20 20  Entities())..   
2380: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2390: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6f 6e 63          bool onc
23a0: 65 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  e = false;..    
23b0: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 71 75            var qu
23c0: 65 72 79 20 3d 20 66 72 6f 6d 20 63 20 69 6e 20  ery = from c in 
23d0: 64 62 2e 43 75 73 74 6f 6d 65 72 73 0d 0a 20 20  db.Customers..  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 20 20 20 20 20 77 68 65 72 65 20 63 2e          where c.
2400: 43 69 74 79 2e 53 74 61 72 74 73 57 69 74 68 28  City.StartsWith(
2410: 76 61 6c 75 65 29 0d 0a 20 20 20 20 20 20 20 20  value)..        
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 6f 72 64 65 72 62 79 20 63 2e 43 75 73 74    orderby c.Cust
2440: 6f 6d 65 72 49 44 0d 0a 20 20 20 20 20 20 20 20  omerID..        
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 73 65 6c 65 63 74 20 63 3b 0d 0a 0d 0a 20    select c;.... 
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2480: 65 61 63 68 20 28 43 75 73 74 6f 6d 65 72 73 20  each (Customers 
2490: 63 75 73 74 6f 6d 65 72 73 20 69 6e 20 71 75 65  customers in que
24a0: 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry)..           
24b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
24c0: 20 20 20 20 20 20 20 20 69 66 20 28 6f 6e 63 65          if (once
24d0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
24e0: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
24f0: 2e 57 72 69 74 65 28 27 20 27 29 3b 0d 0a 0d 0a  .Write(' ');....
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28    Console.Write(
2520: 63 75 73 74 6f 6d 65 72 73 2e 43 75 73 74 6f 6d  customers.Custom
2530: 65 72 49 44 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  erID);....      
2540: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65              once
2550: 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
2560: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2570: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2580: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20      return 0;.. 
2590: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
25a0: 2f 2f 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54  //..      // NOT
25b0: 45 3a 20 55 73 65 64 20 74 6f 20 74 65 73 74 20  E: Used to test 
25c0: 74 68 65 20 66 69 78 20 66 6f 72 20 74 69 63 6b  the fix for tick
25d0: 65 74 20 5b 30 61 33 32 38 38 35 31 30 39 5d 2e  et [0a32885109].
25e0: 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20  ..      //..    
25f0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
2600: 20 69 6e 74 20 55 6e 69 6f 6e 41 6c 6c 54 65 73   int UnionAllTes
2610: 74 28 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  t()..      {..  
2620: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e          using (n
2630: 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69  orthwindEFEntiti
2640: 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74  es db = new nort
2650: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28  hwindEFEntities(
2660: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
2670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2680: 6f 6f 6c 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65  ool once = false
2690: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
26a0: 20 20 20 76 61 72 20 63 75 73 74 6f 6d 65 72 73     var customers
26b0: 31 20 3d 20 64 62 2e 43 75 73 74 6f 6d 65 72 73  1 = db.Customers
26c0: 2e 57 68 65 72 65 28 0d 0a 20 20 20 20 20 20 20  .Where(..       
26d0: 20 20 20 20 20 20 20 20 20 20 20 66 20 3d 3e 20             f => 
26e0: 66 2e 4f 72 64 65 72 73 2e 41 6e 79 28 29 29 2e  f.Orders.Any()).
26f0: 4f 72 64 65 72 42 79 44 65 73 63 65 6e 64 69 6e  OrderByDescendin
2700: 67 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g(..            
2710: 20 20 20 20 20 20 20 20 66 20 3d 3e 20 66 2e 43          f => f.C
2720: 6f 6d 70 61 6e 79 4e 61 6d 65 29 2e 53 6b 69 70  ompanyName).Skip
2730: 28 31 29 2e 54 61 6b 65 28 31 29 3b 0d 0a 0d 0a  (1).Take(1);....
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
2750: 72 20 63 75 73 74 6f 6d 65 72 73 32 20 3d 20 64  r customers2 = d
2760: 62 2e 43 75 73 74 6f 6d 65 72 73 2e 57 68 65 72  b.Customers.Wher
2770: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
2780: 20 20 20 20 20 20 66 20 3d 3e 20 66 2e 4f 72 64        f => f.Ord
2790: 65 72 73 2e 41 6e 79 28 29 29 2e 4f 72 64 65 72  ers.Any()).Order
27a0: 42 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  By(..           
27b0: 20 20 20 20 20 20 20 20 20 66 20 3d 3e 20 66 2e           f => f.
27c0: 43 6f 6d 70 61 6e 79 4e 61 6d 65 29 2e 53 6b 69  CompanyName).Ski
27d0: 70 28 31 29 2e 54 61 6b 65 28 31 29 3b 0d 0a 0d  p(1).Take(1);...
27e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
27f0: 61 72 20 63 75 73 74 6f 6d 65 72 73 33 20 3d 20  ar customers3 = 
2800: 64 62 2e 43 75 73 74 6f 6d 65 72 73 2e 57 68 65  db.Customers.Whe
2810: 72 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  re(..           
2820: 20 20 20 20 20 20 20 66 20 3d 3e 20 66 2e 43 75         f => f.Cu
2830: 73 74 6f 6d 65 72 49 44 2e 53 74 61 72 74 73 57  stomerID.StartsW
2840: 69 74 68 28 22 42 22 29 29 2e 4f 72 64 65 72 42  ith("B")).OrderB
2850: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
2860: 20 20 20 20 20 20 20 20 66 20 3d 3e 20 66 2e 43          f => f.C
2870: 6f 6d 70 61 6e 79 4e 61 6d 65 29 2e 53 6b 69 70  ompanyName).Skip
2880: 28 31 29 2e 54 61 6b 65 28 31 29 3b 0d 0a 0d 0a  (1).Take(1);....
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
28a0: 72 65 61 63 68 20 28 76 61 72 20 63 75 73 74 6f  reach (var custo
28b0: 6d 65 72 20 69 6e 20 63 75 73 74 6f 6d 65 72 73  mer in customers
28c0: 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  1)..            
28d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
28e0: 20 20 20 20 20 20 20 69 66 20 28 6f 6e 63 65 29         if (once)
28f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2900: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
2910: 57 72 69 74 65 28 27 20 27 29 3b 0d 0a 0d 0a 20  Write(' ');.... 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 63   Console.Write(c
2940: 75 73 74 6f 6d 65 72 2e 43 75 73 74 6f 6d 65 72  ustomer.Customer
2950: 49 44 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ID);..          
2960: 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 74          once = t
2970: 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
2980: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
2990: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28         foreach (
29a0: 76 61 72 20 63 75 73 74 6f 6d 65 72 20 69 6e 20  var customer in 
29b0: 63 75 73 74 6f 6d 65 72 73 32 29 0d 0a 20 20 20  customers2)..   
29c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 69 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20  if (once)..     
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27   Console.Write('
2a10: 20 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20   ');....        
2a20: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
2a30: 65 2e 57 72 69 74 65 28 63 75 73 74 6f 6d 65 72  e.Write(customer
2a40: 2e 43 75 73 74 6f 6d 65 72 49 44 29 3b 0d 0a 20  .CustomerID);.. 
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20   once = true;.. 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2a80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a90: 66 6f 72 65 61 63 68 20 28 76 61 72 20 63 75 73  foreach (var cus
2aa0: 74 6f 6d 65 72 20 69 6e 20 63 75 73 74 6f 6d 65  tomer in custome
2ab0: 72 73 33 29 0d 0a 20 20 20 20 20 20 20 20 20 20  rs3)..          
2ac0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2ad0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 6e 63           if (onc
2ae0: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
2af0: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
2b00: 65 2e 57 72 69 74 65 28 27 20 27 29 3b 0d 0a 0d  e.Write(' ');...
2b10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b20: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
2b30: 28 63 75 73 74 6f 6d 65 72 2e 43 75 73 74 6f 6d  (customer.Custom
2b40: 65 72 49 44 29 3b 0d 0a 20 20 20 20 20 20 20 20  erID);..        
2b50: 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d            once =
2b60: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
2b70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2b80: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
2b90: 20 28 76 61 72 20 63 75 73 74 6f 6d 65 72 20 69   (var customer i
2ba0: 6e 20 63 75 73 74 6f 6d 65 72 73 31 2e 43 6f 6e  n customers1.Con
2bb0: 63 61 74 28 63 75 73 74 6f 6d 65 72 73 32 29 29  cat(customers2))
2bc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bd0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2be0: 20 20 20 20 20 69 66 20 28 6f 6e 63 65 29 0d 0a       if (once)..
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72        Console.Wr
2c10: 69 74 65 28 27 20 27 29 3b 0d 0a 0d 0a 20 20 20  ite(' ');....   
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
2c30: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 63 75 73  onsole.Write(cus
2c40: 74 6f 6d 65 72 2e 43 75 73 74 6f 6d 65 72 49 44  tomer.CustomerID
2c50: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
2c60: 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 74 72 75        once = tru
2c70: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
2c80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
2c90: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 76 61       foreach (va
2ca0: 72 20 63 75 73 74 6f 6d 65 72 20 69 6e 0d 0a 20  r customer in.. 
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 20 63 75 73 74 6f 6d 65 72 73 31 2e 43 6f     customers1.Co
2cd0: 6e 63 61 74 28 63 75 73 74 6f 6d 65 72 73 32 29  ncat(customers2)
2ce0: 2e 43 6f 6e 63 61 74 28 63 75 73 74 6f 6d 65 72  .Concat(customer
2cf0: 73 33 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  s3))..          
2d00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2d10: 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 6e 63           if (onc
2d20: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
2d30: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
2d40: 65 2e 57 72 69 74 65 28 27 20 27 29 3b 0d 0a 0d  e.Write(' ');...
2d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d60: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
2d70: 28 63 75 73 74 6f 6d 65 72 2e 43 75 73 74 6f 6d  (customer.Custom
2d80: 65 72 49 44 29 3b 0d 0a 20 20 20 20 20 20 20 20  erID);..        
2d90: 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d            once =
2da0: 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
2db0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2dc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2dd0: 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
2de0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f     }....      //
2df0: 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a  ..      // NOTE:
2e00: 20 55 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   Used to test th
2e10: 65 20 66 69 78 20 66 6f 72 20 74 69 63 6b 65 74  e fix for ticket
2e20: 20 5b 63 63 66 61 36 39 66 63 33 32 5d 2e 0d 0a   [ccfa69fc32]...
2e30: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2e40: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69  private static i
2e50: 6e 74 20 45 46 54 72 61 6e 73 61 63 74 69 6f 6e  nt EFTransaction
2e60: 54 65 73 74 28 62 6f 6f 6c 20 61 64 64 29 0d 0a  Test(bool add)..
2e70: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2e80: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2e90: 20 2f 2f 20 4e 4f 54 45 3a 20 53 6f 6d 65 20 6f   // NOTE: Some o
2ea0: 66 20 74 68 65 73 65 20 74 65 72 72 69 74 6f 72  f these territor
2eb0: 69 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  ies already exis
2ec0: 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 63 61 75  t and should cau
2ed0: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  se..          //
2ee0: 20 20 20 20 20 20 20 61 6e 20 65 78 63 65 70 74         an except
2ef0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 72 6f 77 6e  ion to be thrown
2f00: 20 77 68 65 6e 20 77 65 20 74 72 79 20 74 6f 20   when we try to 
2f10: 49 4e 53 45 52 54 20 74 68 65 6d 2e 0d 0a 20 20  INSERT them...  
2f20: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2f30: 20 20 20 20 20 20 6c 6f 6e 67 5b 5d 20 74 65 72        long[] ter
2f40: 72 69 74 6f 72 79 49 64 73 20 3d 20 6e 65 77 20  ritoryIds = new 
2f50: 6c 6f 6e 67 5b 5d 20 7b 0d 0a 20 20 20 20 20 20  long[] {..      
2f60: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
2f70: 20 32 2c 20 20 20 20 33 2c 20 20 20 20 34 2c 20   2,    3,    4, 
2f80: 20 20 20 35 2c 20 2f 2f 20 4e 4f 54 45 3a 20 53     5, // NOTE: S
2f90: 75 63 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20  uccess..        
2fa0: 20 20 20 20 20 20 20 20 20 36 2c 20 20 20 20 37           6,    7
2fb0: 2c 20 20 20 20 38 2c 20 20 20 20 39 2c 20 20 20  ,    8,    9,   
2fc0: 31 30 2c 20 2f 2f 20 4e 4f 54 45 3a 20 53 75 63  10, // NOTE: Suc
2fd0: 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 20 20  cess..          
2fe0: 20 20 20 20 31 35 37 36 2c 20 31 35 37 37 2c 20      1576, 1577, 
2ff0: 31 35 37 38 2c 20 31 35 37 39 2c 20 31 35 38 30  1578, 1579, 1580
3000: 2c 20 2f 2f 20 4e 4f 54 45 3a 20 53 75 63 63 65  , // NOTE: Succe
3010: 73 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss..            
3020: 20 20 31 35 38 31 2c 20 31 37 33 30 2c 20 31 38    1581, 1730, 18
3030: 33 33 2c 20 32 31 31 36 2c 20 32 31 33 39 2c 20  33, 2116, 2139, 
3040: 2f 2f 20 4e 4f 54 45 3a 20 46 61 69 6c 20 28 31  // NOTE: Fail (1
3050: 35 38 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20  581)..          
3060: 20 20 20 20 32 31 34 30 2c 20 32 31 34 31 20 20      2140, 2141  
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 2f 2f 20 4e 4f 54 45 3a 20 53 6b 69 70 70    // NOTE: Skipp
3090: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  ed..          };
30a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
30b0: 20 28 61 64 64 29 0d 0a 20 20 20 20 20 20 20 20   (add)..        
30c0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
30d0: 20 20 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77     using (northw
30e0: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 20 64 62  indEFEntities db
30f0: 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64   = new northwind
3100: 45 46 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20  EFEntities()).. 
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 20 20 75 73 69 6e 67 20 28 54 72 61 6e 73 61 63    using (Transac
3140: 74 69 6f 6e 53 63 6f 70 65 20 73 63 6f 70 65 20  tionScope scope 
3150: 3d 20 6e 65 77 20 54 72 61 6e 73 61 63 74 69 6f  = new Transactio
3160: 6e 53 63 6f 70 65 28 29 29 0d 0a 20 20 20 20 20  nScope())..     
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 2f 2f 20 4e 4f 54 45 3a 20 2a 52 45 51 55 49 52  // NOTE: *REQUIR
31c0: 45 44 2a 20 54 68 69 73 20 69 73 20 72 65 71 75  ED* This is requ
31d0: 69 72 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ired so that the
31e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
31f0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
3200: 20 45 6e 74 69 74 79 20 46 72 61 6d 65 77 6f 72   Entity Framewor
3210: 6b 20 69 73 20 70 72 65 76 65 6e 74 65 64 20 66  k is prevented f
3220: 72 6f 6d 20 6f 70 65 6e 69 6e 67 0d 0a 20 20 20  rom opening..   
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 20 2f 2f 20 20 20 20 20 20 20 6d 75 6c 74     //       mult
3250: 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  iple connections
3260: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
3270: 6e 67 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ng SQLite..     
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2f 20 20 20 20 20 20 20 64 61 74 61 62 61   //       databa
32a0: 73 65 20 28 69 2e 65 2e 20 77 68 69 63 68 20 77  se (i.e. which w
32b0: 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 6d  ould result in m
32c0: 75 6c 74 69 70 6c 65 0d 0a 20 20 20 20 20 20 20  ultiple..       
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e0: 2f 20 20 20 20 20 20 20 49 4d 4d 45 44 49 41 54  /       IMMEDIAT
32f0: 45 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  E transactions, 
3300: 74 68 65 72 65 62 79 20 66 61 69 6c 69 6e 67 20  thereby failing 
3310: 5b 6c 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20  [later..        
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
3330: 20 20 20 20 20 20 20 6f 6e 5d 20 77 69 74 68 20         on] with 
3340: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 73 29 2e  locking errors).
3350: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3360: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 64 62 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e    db.Connection.
3390: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 66 6f 72 65 61 63 68 20 28 69 6e 74 20 69 64   foreach (int id
33c0: 20 69 6e 20 74 65 72 72 69 74 6f 72 79 49 64 73   in territoryIds
33d0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
33e0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 20 20 20 54 65 72 72 69 74 6f 72 69 65        Territorie
3410: 73 20 74 65 72 72 69 74 6f 72 69 65 73 20 3d 20  s territories = 
3420: 6e 65 77 20 54 65 72 72 69 74 6f 72 69 65 73 28  new Territories(
3430: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 74 65 72 72 69 74 6f 72 69 65 73 2e 54 65 72 72  territories.Terr
3460: 69 74 6f 72 79 49 44 20 3d 20 69 64 3b 0d 0a 20  itoryID = id;.. 
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 20 20 20 20 20 20 74 65 72 72 69 74 6f           territo
3490: 72 69 65 73 2e 54 65 72 72 69 74 6f 72 79 44 65  ries.TerritoryDe
34a0: 73 63 72 69 70 74 69 6f 6e 20 3d 20 53 74 72 69  scription = Stri
34b0: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 20 20 20 20 22 54 65 73 74 20            "Test 
34e0: 54 65 72 72 69 74 6f 72 79 20 23 7b 30 7d 22 2c  Territory #{0}",
34f0: 20 69 64 29 3b 0d 0a 20 20 20 20 20 20 20 20 20   id);..         
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 74 65 72 72 69 74 6f 72 69 65 73 2e 52 65 67   territories.Reg
3520: 69 6f 6e 73 20 3d 20 64 62 2e 52 65 67 69 6f 6e  ions = db.Region
3530: 73 2e 46 69 72 73 74 28 29 3b 0d 0a 0d 0a 20 20  s.First();....  
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 20 20 20 20 20 20 20 20 64 62 2e 41 64 64 4f 62          db.AddOb
3560: 6a 65 63 74 28 22 54 65 72 72 69 74 6f 72 69 65  ject("Territorie
3570: 73 22 2c 20 74 65 72 72 69 74 6f 72 69 65 73 29  s", territories)
3580: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
3590: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
35d0: 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c 20  ..#if NET_40 || 
35e0: 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34 35  NET_45 || NET_45
35f0: 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1..             
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2e               db.
3610: 53 61 76 65 43 68 61 6e 67 65 73 28 53 61 76 65  SaveChanges(Save
3620: 4f 70 74 69 6f 6e 73 2e 4e 6f 6e 65 29 3b 0d 0a  Options.None);..
3630: 23 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20  #else..         
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 64 62 2e 53 61 76 65 43 68 61 6e 67 65 73 28   db.SaveChanges(
3660: 66 61 6c 73 65 29 3b 0d 0a 23 65 6e 64 69 66 0d  false);..#endif.
3670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3680: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e  catch (Exception
36b0: 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   e)..           
36c0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e0: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
36f0: 57 72 69 74 65 4c 69 6e 65 28 65 29 3b 0d 0a 20  WriteLine(e);.. 
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
3730: 6e 61 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20  nally..         
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 20 20 20 73 63 6f 70 65 2e            scope.
3770: 43 6f 6d 70 6c 65 74 65 28 29 3b 0d 0a 20 20 20  Complete();..   
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 20 20 20 64 62 2e 41 63 63 65 70 74         db.Accept
37a0: 41 6c 6c 43 68 61 6e 67 65 73 28 29 3b 0d 0a 20  AllChanges();.. 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
37d0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
37e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
37f0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
3800: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
3810: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3820: 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72        using (nor
3830: 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73  thwindEFEntities
3840: 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77   db = new northw
3850: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29  indEFEntities())
3860: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3870: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3880: 20 20 20 20 20 62 6f 6f 6c 20 6f 6e 63 65 20 3d       bool once =
3890: 20 66 61 6c 73 65 3b 0d 0a 23 69 66 20 4e 45 54   false;..#if NET
38a0: 5f 34 30 20 7c 7c 20 4e 45 54 5f 34 35 20 7c 7c  _40 || NET_45 ||
38b0: 20 4e 45 54 5f 34 35 31 0d 0a 20 20 20 20 20 20   NET_451..      
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
38d0: 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 74 20 69  query = from t i
38e0: 6e 20 64 62 2e 54 65 72 72 69 74 6f 72 69 65 73  n db.Territories
38f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3900: 20 20 20 20 20 20 77 68 65 72 65 20 74 65 72 72        where terr
3910: 69 74 6f 72 79 49 64 73 2e 41 73 51 75 65 72 79  itoryIds.AsQuery
3920: 61 62 6c 65 3c 6c 6f 6e 67 3e 28 29 2e 43 6f 6e  able<long>().Con
3930: 74 61 69 6e 73 3c 6c 6f 6e 67 3e 28 74 2e 54 65  tains<long>(t.Te
3940: 72 72 69 74 6f 72 79 49 44 29 0d 0a 20 20 20 20  rritoryID)..    
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 6f 72 64 65 72 62 79 20 74 2e 54 65 72 72 69 74  orderby t.Territ
3970: 6f 72 79 49 44 0d 0a 20 20 20 20 20 20 20 20 20  oryID..         
3980: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63             selec
3990: 74 20 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  t t;....        
39a0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
39b0: 68 20 28 54 65 72 72 69 74 6f 72 69 65 73 20 74  h (Territories t
39c0: 65 72 72 69 74 6f 72 69 65 73 20 69 6e 20 71 75  erritories in qu
39d0: 65 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ery)..          
39e0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 69 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20   if (once)..    
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72        Console.Wr
3a30: 69 74 65 28 27 20 27 29 3b 0d 0a 0d 0a 20 20 20  ite(' ');....   
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
3a60: 28 74 65 72 72 69 74 6f 72 69 65 73 2e 54 65 72  (territories.Ter
3a70: 72 69 74 6f 72 79 49 44 29 3b 0d 0a 0d 0a 20 20  ritoryID);....  
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b      once = true;
3aa0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ab0: 20 20 20 20 7d 0d 0a 23 65 6c 73 65 0d 0a 20 20      }..#else..  
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ad0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
3ae0: 20 20 20 20 20 20 2f 2f 20 48 41 43 4b 3a 20 57        // HACK: W
3af0: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 74 68 65  e cannot use the
3b00: 20 43 6f 6e 74 61 69 6e 73 20 65 78 74 65 6e 73   Contains extens
3b10: 69 6f 6e 20 6d 65 74 68 6f 64 20 77 69 74 68 69  ion method withi
3b20: 6e 20 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n a..           
3b30: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
3b40: 4c 49 4e 51 20 71 75 65 72 79 20 77 69 74 68 20  LINQ query with 
3b50: 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  the .NET Framewo
3b60: 72 6b 20 33 2e 35 2e 0d 0a 20 20 20 20 20 20 20  rk 3.5...       
3b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b90: 20 76 61 72 20 71 75 65 72 79 20 3d 20 66 72 6f   var query = fro
3ba0: 6d 20 74 20 69 6e 20 64 62 2e 54 65 72 72 69 74  m t in db.Territ
3bb0: 6f 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20  ories..         
3bc0: 20 20 20 20 20 20 20 20 20 20 20 6f 72 64 65 72             order
3bd0: 62 79 20 74 2e 54 65 72 72 69 74 6f 72 79 49 44  by t.TerritoryID
3be0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3bf0: 20 20 20 20 20 20 73 65 6c 65 63 74 20 74 3b 0d        select t;.
3c00: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3c10: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 54 65       foreach (Te
3c20: 72 72 69 74 6f 72 69 65 73 20 74 65 72 72 69 74  rritories territ
3c30: 6f 72 69 65 73 20 69 6e 20 71 75 65 72 79 29 0d  ories in query).
3c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c50: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3c70: 41 72 72 61 79 2e 49 6e 64 65 78 4f 66 28 74 65  Array.IndexOf(te
3c80: 72 72 69 74 6f 72 79 49 64 73 2c 20 74 65 72 72  rritoryIds, terr
3c90: 69 74 6f 72 69 65 73 2e 54 65 72 72 69 74 6f 72  itories.Territor
3ca0: 79 49 44 29 20 3d 3d 20 2d 31 29 0d 0a 20 20 20  yID) == -1)..   
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cc0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
3cd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3ce0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6f 6e            if (on
3cf0: 63 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce)..           
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
3d10: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27 20 27  onsole.Write(' '
3d20: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
3d40: 6f 6c 65 2e 57 72 69 74 65 28 74 65 72 72 69 74  ole.Write(territ
3d50: 6f 72 69 65 73 2e 54 65 72 72 69 74 6f 72 79 49  ories.TerritoryI
3d60: 44 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  D);....         
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 63               onc
3d80: 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  e = true;..     
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
3da0: 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20  #endif..        
3db0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
3dc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
3dd0: 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
3de0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f     }....      //
3df0: 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a  ..      // NOTE:
3e00: 20 55 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   Used to test th
3e10: 65 20 55 50 44 41 54 45 20 66 69 78 20 28 69 2e  e UPDATE fix (i.
3e20: 65 2e 20 74 68 65 20 6d 69 73 73 69 6e 67 20 73  e. the missing s
3e30: 65 6d 69 2d 63 6f 6c 6f 6e 0d 0a 20 20 20 20 20  emi-colon..     
3e40: 20 2f 2f 20 20 20 20 20 20 20 69 6e 20 74 68 65   //       in the
3e50: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
3e60: 65 74 77 65 65 6e 20 74 68 65 20 61 63 74 75 61  etween the actua
3e70: 6c 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  l UPDATE stateme
3e80: 6e 74 0d 0a 20 20 20 20 20 20 2f 2f 20 20 20 20  nt..      //    
3e90: 20 20 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f     and the follo
3ea0: 77 2d 75 70 20 53 45 4c 45 43 54 20 73 74 61 74  w-up SELECT stat
3eb0: 65 6d 65 6e 74 29 2e 0d 0a 20 20 20 20 20 20 2f  ement)...      /
3ec0: 2f 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74 65  /..      private
3ed0: 20 73 74 61 74 69 63 20 69 6e 74 20 55 70 64 61   static int Upda
3ee0: 74 65 54 65 73 74 28 29 0d 0a 20 20 20 20 20 20  teTest()..      
3ef0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 6e  {..          lon
3f00: 67 5b 5d 20 6f 72 64 65 72 49 64 73 20 3d 20 6e  g[] orderIds = n
3f10: 65 77 20 6c 6f 6e 67 5b 5d 20 7b 0d 0a 20 20 20  ew long[] {..   
3f20: 20 20 20 20 20 20 20 20 20 20 20 30 0d 0a 20 20             0..  
3f30: 20 20 20 20 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20          };....  
3f40: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e          using (n
3f50: 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69  orthwindEFEntiti
3f60: 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74  es db = new nort
3f70: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28  hwindEFEntities(
3f80: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
3f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
3fa0: 6e 74 5b 5d 20 63 6f 75 6e 74 73 20 3d 20 7b 20  nt[] counts = { 
3fb0: 30 2c 20 30 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20  0, 0 };....     
3fc0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
3fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
3fe0: 54 45 3a 20 2a 52 45 51 55 49 52 45 44 2a 20 54  TE: *REQUIRED* T
3ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
4000: 73 6f 20 74 68 61 74 20 74 68 65 0d 0a 20 20 20  so that the..   
4010: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
4020: 20 20 20 20 45 6e 74 69 74 79 20 46 72 61 6d 65      Entity Frame
4030: 77 6f 72 6b 20 69 73 20 70 72 65 76 65 6e 74 65  work is prevente
4040: 64 20 66 72 6f 6d 20 6f 70 65 6e 69 6e 67 0d 0a  d from opening..
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
4060: 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20         multiple 
4070: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
4080: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51  he underlying SQ
4090: 4c 69 74 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Lite..          
40a0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 64 61 74      //       dat
40b0: 61 62 61 73 65 20 28 69 2e 65 2e 20 77 68 69 63  abase (i.e. whic
40c0: 68 20 77 6f 75 6c 64 20 72 65 73 75 6c 74 20 69  h would result i
40d0: 6e 20 6d 75 6c 74 69 70 6c 65 0d 0a 20 20 20 20  n multiple..    
40e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
40f0: 20 20 20 49 4d 4d 45 44 49 41 54 45 20 74 72 61     IMMEDIATE tra
4100: 6e 73 61 63 74 69 6f 6e 73 2c 20 74 68 65 72 65  nsactions, there
4110: 62 79 20 66 61 69 6c 69 6e 67 20 5b 6c 61 74 65  by failing [late
4120: 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r..             
4130: 20 2f 2f 20 20 20 20 20 20 20 6f 6e 5d 20 77 69   //       on] wi
4140: 74 68 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72  th locking error
4150: 73 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s)...           
4160: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
4170: 20 20 20 20 20 64 62 2e 43 6f 6e 6e 65 63 74 69       db.Connecti
4180: 6f 6e 2e 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20  on.Open();....  
4190: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
41a0: 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30 3b 20  (int index = 0; 
41b0: 69 6e 64 65 78 20 3c 20 6f 72 64 65 72 49 64 73  index < orderIds
41c0: 2e 4c 65 6e 67 74 68 3b 20 69 6e 64 65 78 2b 2b  .Length; index++
41d0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
41e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
41f0: 20 20 20 20 20 20 4f 72 64 65 72 73 20 6e 65 77        Orders new
4200: 4f 72 64 65 72 73 20 3d 20 6e 65 77 20 4f 72 64  Orders = new Ord
4210: 65 72 73 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ers();....      
4220: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f              newO
4230: 72 64 65 72 73 2e 53 68 69 70 41 64 64 72 65 73  rders.ShipAddres
4240: 73 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  s = String.Forma
4250: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
4260: 20 20 20 20 20 20 20 20 20 20 22 54 65 73 74 20            "Test 
4270: 4f 72 64 65 72 20 53 68 69 70 20 41 64 64 72 65  Order Ship Addre
4280: 73 73 2c 20 49 6e 64 65 78 20 23 7b 30 7d 22 2c  ss, Index #{0}",
4290: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
42a0: 20 20 20 20 20 20 20 20 69 6e 64 65 78 29 3b 0d          index);.
42b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
42c0: 20 20 20 20 20 64 62 2e 41 64 64 4f 62 6a 65 63       db.AddObjec
42d0: 74 28 22 4f 72 64 65 72 73 22 2c 20 6e 65 77 4f  t("Orders", newO
42e0: 72 64 65 72 73 29 3b 0d 0a 0d 0a 20 20 20 20 20  rders);....     
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
4300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4310: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2e               db.
4330: 53 61 76 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a  SaveChanges();..
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 20 20 63 6f 75 6e 74 73 5b 30 5d 2b        counts[0]+
4360: 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  +;....          
4370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 53              // S
4380: 74 6f 72 65 47 65 6e 65 72 61 74 65 64 50 61 74  toreGeneratedPat
4390: 74 65 72 6e 3d 22 49 64 65 6e 74 69 74 79 22 0d  tern="Identity".
43a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
43b0: 20 20 20 20 20 20 20 6f 72 64 65 72 49 64 73 5b         orderIds[
43c0: 69 6e 64 65 78 5d 20 3d 20 6e 65 77 4f 72 64 65  index] = newOrde
43d0: 72 73 2e 4f 72 64 65 72 49 44 3b 0d 0a 0d 0a 20  rs.OrderID;.... 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 2f 2f 20 53 74 6f 72 65 47 65 6e       // StoreGen
4400: 65 72 61 74 65 64 50 61 74 74 65 72 6e 3d 22 4e  eratedPattern="N
4410: 6f 6e 65 22 0d 0a 20 20 20 20 20 20 20 20 20 20  one"..          
4420: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f              newO
4430: 72 64 65 72 73 2e 53 68 69 70 41 64 64 72 65 73  rders.ShipAddres
4440: 73 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  s = String.Forma
4450: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
4470: 65 77 20 4f 72 64 65 72 20 53 68 69 70 20 41 64  ew Order Ship Ad
4480: 64 72 65 73 73 20 23 7b 30 7d 22 2c 0d 0a 20 20  dress #{0}",..  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 20 20 20 20 6f 72 64 65 72 49 64 73          orderIds
44b0: 5b 69 6e 64 65 78 5d 29 3b 0d 0a 0d 0a 20 20 20  [index]);....   
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 2f 2f 20 53 74 6f 72 65 47 65 6e 65 72     // StoreGener
44e0: 61 74 65 64 50 61 74 74 65 72 6e 3d 22 43 6f 6d  atedPattern="Com
44f0: 70 75 74 65 64 22 0d 0a 20 20 20 20 20 20 20 20  puted"..        
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
4510: 77 4f 72 64 65 72 73 2e 46 72 65 69 67 68 74 20  wOrders.Freight 
4520: 3d 20 31 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  = 1;....        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
4540: 2e 53 61 76 65 43 68 61 6e 67 65 73 28 29 3b 0d  .SaveChanges();.
4550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4560: 20 20 20 20 20 20 20 63 6f 75 6e 74 73 5b 31 5d         counts[1]
4570: 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ++;..           
4580: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4590: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
45a0: 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d  h (Exception e).
45b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
45c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
45e0: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 65 29  ole.WriteLine(e)
45f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
4600: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
4610: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c            finall
4620: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
4630: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
4650: 2e 41 63 63 65 70 74 41 6c 6c 43 68 61 6e 67 65  .AcceptAllChange
4660: 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  s();..          
4670: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
4680: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
4690: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
46a0: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 0d 0a  ole.WriteLine(..
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 22 69 6e 73 65 72 74 65 64 20 7b 30 7d 20    "inserted {0} 
46d0: 75 70 64 61 74 65 64 20 7b 31 7d 22 2c 20 63 6f  updated {1}", co
46e0: 75 6e 74 73 5b 30 5d 2c 20 63 6f 75 6e 74 73 5b  unts[0], counts[
46f0: 31 5d 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  1]);..          
4700: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72  }....          r
4710: 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 20 20  eturn 0;..      
4720: 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20  }....      //.. 
4730: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 55 73       // NOTE: Us
4740: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 42  ed to test the B
4750: 69 6e 61 72 79 47 55 49 44 20 66 69 78 20 28 69  inaryGUID fix (i
4760: 2e 65 2e 20 42 4c 4f 42 20 6c 69 74 65 72 61 6c  .e. BLOB literal
4770: 20 66 6f 72 6d 61 74 74 69 6e 67 0d 0a 20 20 20   formatting..   
4780: 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 66 20 47     //       of G
4790: 55 49 44 20 76 61 6c 75 65 73 20 77 68 65 6e 20  UID values when 
47a0: 74 68 65 20 42 69 6e 61 72 79 47 55 49 44 20 63  the BinaryGUID c
47b0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 70 65 72  onnection proper
47c0: 74 79 20 68 61 73 20 62 65 65 6e 0d 0a 20 20 20  ty has been..   
47d0: 20 20 20 2f 2f 20 20 20 20 20 20 20 65 6e 61 62     //       enab
47e0: 6c 65 64 29 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d  led)...      //.
47f0: 0a 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73  .      private s
4800: 74 61 74 69 63 20 69 6e 74 20 42 69 6e 61 72 79  tatic int Binary
4810: 47 75 69 64 54 65 73 74 28 62 6f 6f 6c 20 62 69  GuidTest(bool bi
4820: 6e 61 72 79 47 75 69 64 29 0d 0a 20 20 20 20 20  naryGuid)..     
4830: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 45 6e   {..          En
4840: 76 69 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76  vironment.SetEnv
4850: 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
4860: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
4870: 20 22 41 70 70 65 6e 64 4d 61 6e 69 66 65 73 74   "AppendManifest
4880: 54 6f 6b 65 6e 5f 53 51 4c 69 74 65 50 72 6f 76  Token_SQLiteProv
4890: 69 64 65 72 4d 61 6e 69 66 65 73 74 22 2c 0d 0a  iderManifest",..
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
48b0: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 3b 42 69  ring.Format(";Bi
48c0: 6e 61 72 79 47 55 49 44 3d 7b 30 7d 3b 22 2c 20  naryGUID={0};", 
48d0: 62 69 6e 61 72 79 47 75 69 64 29 29 3b 0d 0a 0d  binaryGuid));...
48e0: 0a 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67  .          using
48f0: 20 28 6e 6f 72 74 68 77 69 6e 64 45 46 45 6e 74   (northwindEFEnt
4900: 69 74 69 65 73 20 64 62 20 3d 20 6e 65 77 20 6e  ities db = new n
4910: 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69  orthwindEFEntiti
4920: 65 73 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20  es())..         
4930: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4940: 20 20 73 74 72 69 6e 67 20 73 71 6c 20 3d 20 22    string sql = "
4950: 53 45 4c 45 43 54 20 56 41 4c 55 45 20 47 55 49  SELECT VALUE GUI
4960: 44 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  D " +..         
4970: 20 20 20 20 20 20 20 20 20 22 27 32 64 33 64 32           "'2d3d2
4980: 64 33 64 2d 32 64 33 64 2d 32 64 33 64 2d 32 64  d3d-2d3d-2d3d-2d
4990: 33 64 2d 32 64 33 64 32 64 33 64 32 64 33 64 27  3d-2d3d2d3d2d3d'
49a0: 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20   " +..          
49b0: 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 4f 72          "FROM Or
49c0: 64 65 72 73 20 41 53 20 6f 20 57 48 45 52 45 20  ders AS o WHERE 
49d0: 6f 2e 4f 72 64 65 72 49 44 20 3d 20 31 30 32 34  o.OrderID = 1024
49e0: 38 3b 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  8;";....        
49f0: 20 20 20 20 20 20 4f 62 6a 65 63 74 51 75 65 72        ObjectQuer
4a00: 79 3c 73 74 72 69 6e 67 3e 20 71 75 65 72 79 20  y<string> query 
4a10: 3d 20 64 62 2e 43 72 65 61 74 65 51 75 65 72 79  = db.CreateQuery
4a20: 3c 73 74 72 69 6e 67 3e 28 73 71 6c 29 3b 0d 0a  <string>(sql);..
4a30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4a40: 66 6f 72 65 61 63 68 20 28 73 74 72 69 6e 67 20  foreach (string 
4a50: 73 20 69 6e 20 71 75 65 72 79 29 0d 0a 20 20 20  s in query)..   
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
4a70: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
4a80: 28 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  (s);..          
4a90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 45  }....          E
4aa0: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e  nvironment.SetEn
4ab0: 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c  vironmentVariabl
4ac0: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
4ad0: 20 20 22 41 70 70 65 6e 64 4d 61 6e 69 66 65 73    "AppendManifes
4ae0: 74 54 6f 6b 65 6e 5f 53 51 4c 69 74 65 50 72 6f  tToken_SQLitePro
4af0: 76 69 64 65 72 4d 61 6e 69 66 65 73 74 22 2c 0d  viderManifest",.
4b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
4b10: 75 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ull);....       
4b20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20     return 0;..  
4b30: 20 20 20 20 7d 0d 0a 0d 0a 23 69 66 20 4e 45 54      }....#if NET
4b40: 5f 34 30 20 7c 7c 20 4e 45 54 5f 34 35 20 7c 7c  _40 || NET_45 ||
4b50: 20 4e 45 54 5f 34 35 31 0d 0a 20 20 20 20 20 20   NET_451..      
4b60: 2f 2f 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54  //..      // NOT
4b70: 45 3a 20 55 73 65 64 20 74 6f 20 74 65 73 74 20  E: Used to test 
4b80: 74 68 65 20 42 69 6e 61 72 79 47 55 49 44 20 63  the BinaryGUID c
4b90: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 72 69 6e 67  onnection string
4ba0: 20 70 72 6f 70 65 72 74 79 20 77 69 74 68 0d 0a   property with..
4bb0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74        //       t
4bc0: 68 65 20 43 6f 6e 74 61 69 6e 73 28 29 20 66 75  he Contains() fu
4bd0: 6e 63 74 69 6f 6e 20 28 74 69 63 6b 65 74 20 5b  nction (ticket [
4be0: 61 34 64 39 63 37 65 65 39 34 5d 29 2e 20 20 57  a4d9c7ee94]).  W
4bf0: 65 20 63 61 6e 6e 6f 74 0d 0a 20 20 20 20 20 20  e cannot..      
4c00: 2f 2f 20 20 20 20 20 20 20 75 73 65 20 74 68 65  //       use the
4c10: 20 43 6f 6e 74 61 69 6e 73 20 65 78 74 65 6e 73   Contains extens
4c20: 69 6f 6e 20 6d 65 74 68 6f 64 20 77 69 74 68 69  ion method withi
4c30: 6e 20 61 20 4c 49 4e 51 20 71 75 65 72 79 20 77  n a LINQ query w
4c40: 69 74 68 0d 0a 20 20 20 20 20 20 2f 2f 20 20 20  ith..      //   
4c50: 20 20 20 20 74 68 65 20 2e 4e 45 54 20 46 72 61      the .NET Fra
4c60: 6d 65 77 6f 72 6b 20 33 2e 35 2e 0d 0a 20 20 20  mework 3.5...   
4c70: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 70 72 69     //..      pri
4c80: 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20  vate static int 
4c90: 42 69 6e 61 72 79 47 75 69 64 54 65 73 74 32 28  BinaryGuidTest2(
4ca0: 62 6f 6f 6c 20 62 69 6e 61 72 79 47 75 69 64 29  bool binaryGuid)
4cb0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
4cc0: 20 20 20 20 20 45 6e 76 69 72 6f 6e 6d 65 6e 74       Environment
4cd0: 2e 53 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  .SetEnvironmentV
4ce0: 61 72 69 61 62 6c 65 28 0d 0a 20 20 20 20 20 20  ariable(..      
4cf0: 20 20 20 20 20 20 20 20 22 41 70 70 65 6e 64 4d          "AppendM
4d00: 61 6e 69 66 65 73 74 54 6f 6b 65 6e 5f 53 51 4c  anifestToken_SQL
4d10: 69 74 65 50 72 6f 76 69 64 65 72 4d 61 6e 69 66  iteProviderManif
4d20: 65 73 74 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  est",..         
4d30: 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d       String.Form
4d40: 61 74 28 22 3b 42 69 6e 61 72 79 47 55 49 44 3d  at(";BinaryGUID=
4d50: 7b 30 7d 3b 22 2c 20 62 69 6e 61 72 79 47 75 69  {0};", binaryGui
4d60: 64 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d));....        
4d70: 20 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69    using (northwi
4d80: 6e 64 45 46 45 6e 74 69 74 69 65 73 20 64 62 20  ndEFEntities db 
4d90: 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45  = new northwindE
4da0: 46 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20  FEntities())..  
4db0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
4dc0: 20 20 20 20 20 20 20 20 20 47 75 69 64 20 67 75           Guid gu
4dd0: 69 64 20 3d 20 6e 65 77 20 47 75 69 64 28 22 32  id = new Guid("2
4de0: 64 33 64 32 64 33 64 2d 32 64 33 64 2d 32 64 33  d3d2d3d-2d3d-2d3
4df0: 64 2d 32 64 33 64 2d 32 64 33 64 32 64 33 64 32  d-2d3d-2d3d2d3d2
4e00: 64 33 64 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  d3d");..        
4e10: 20 20 20 20 20 20 47 75 69 64 5b 5d 20 67 75 69        Guid[] gui
4e20: 64 73 20 3d 20 6e 65 77 20 47 75 69 64 5b 5d 20  ds = new Guid[] 
4e30: 7b 20 67 75 69 64 20 7d 3b 0d 0a 0d 0a 20 20 20  { guid };....   
4e40: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
4e50: 6f 6e 63 65 20 3d 20 66 61 6c 73 65 3b 0d 0a 20  once = false;.. 
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72               var
4e70: 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 74 20   query = from t 
4e80: 69 6e 20 64 62 2e 54 65 72 72 69 74 6f 72 69 65  in db.Territorie
4e90: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
4eb0: 72 65 20 67 75 69 64 73 2e 41 73 51 75 65 72 79  re guids.AsQuery
4ec0: 61 62 6c 65 3c 47 75 69 64 3e 28 29 2e 43 6f 6e  able<Guid>().Con
4ed0: 74 61 69 6e 73 3c 47 75 69 64 3e 28 67 75 69 64  tains<Guid>(guid
4ee0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 64               ord
4f00: 65 72 62 79 20 74 2e 54 65 72 72 69 74 6f 72 79  erby t.Territory
4f10: 49 44 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ID..            
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
4f30: 6c 65 63 74 20 74 3b 0d 0a 0d 0a 20 20 20 20 20  lect t;....     
4f40: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
4f50: 20 28 54 65 72 72 69 74 6f 72 69 65 73 20 74 20   (Territories t 
4f60: 69 6e 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20  in query)..     
4f70: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4f90: 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20 20   (once)..       
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
4fb0: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27 20 27  onsole.Write(' '
4fc0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
4fd0: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
4fe0: 57 72 69 74 65 28 74 2e 54 65 72 72 69 74 6f 72  Write(t.Territor
4ff0: 79 49 44 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  yID);....       
5000: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20             once 
5010: 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20  = true;..       
5020: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
5030: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
5040: 20 20 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 53     Environment.S
5050: 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  etEnvironmentVar
5060: 69 61 62 6c 65 28 0d 0a 20 20 20 20 20 20 20 20  iable(..        
5070: 20 20 20 20 20 20 22 41 70 70 65 6e 64 4d 61 6e        "AppendMan
5080: 69 66 65 73 74 54 6f 6b 65 6e 5f 53 51 4c 69 74  ifestToken_SQLit
5090: 65 50 72 6f 76 69 64 65 72 4d 61 6e 69 66 65 73  eProviderManifes
50a0: 74 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t",..           
50b0: 20 20 20 6e 75 6c 6c 29 3b 0d 0a 0d 0a 20 20 20     null);....   
50c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
50d0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69  ..      }..#endi
50e0: 66 0d 0a 0d 0a 20 20 20 20 20 20 70 72 69 76 61  f....      priva
50f0: 74 65 20 73 74 61 74 69 63 20 69 6e 74 20 44 61  te static int Da
5100: 74 65 54 69 6d 65 54 65 73 74 28 29 0d 0a 20 20  teTimeTest()..  
5110: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5120: 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69 6e   using (northwin
5130: 64 45 46 45 6e 74 69 74 69 65 73 20 64 62 20 3d  dEFEntities db =
5140: 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45 46   new northwindEF
5150: 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20 20  Entities())..   
5160: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5170: 20 20 20 20 20 20 20 20 44 61 74 65 54 69 6d 65          DateTime
5180: 20 64 61 74 65 54 69 6d 65 20 3d 20 6e 65 77 20   dateTime = new 
5190: 44 61 74 65 54 69 6d 65 28 31 39 39 37 2c 20 31  DateTime(1997, 1
51a0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 44 61  , 1, 0, 0, 0, Da
51b0: 74 65 54 69 6d 65 4b 69 6e 64 2e 4c 6f 63 61 6c  teTimeKind.Local
51c0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
51d0: 20 20 69 6e 74 20 63 31 20 3d 20 64 62 2e 4f 72    int c1 = db.Or
51e0: 64 65 72 73 2e 57 68 65 72 65 28 69 20 3d 3e 20  ders.Where(i => 
51f0: 69 2e 4f 72 64 65 72 44 61 74 65 20 3d 3d 20 6e  i.OrderDate == n
5200: 65 77 20 44 61 74 65 54 69 6d 65 28 31 39 39 37  ew DateTime(1997
5210: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 1, 0, 0, 0,
5220: 20 44 61 74 65 54 69 6d 65 4b 69 6e 64 2e 4c 6f   DateTimeKind.Lo
5230: 63 61 6c 29 29 2e 43 6f 75 6e 74 28 29 3b 0d 0a  cal)).Count();..
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
5250: 74 20 63 32 20 3d 20 64 62 2e 4f 72 64 65 72 73  t c2 = db.Orders
5260: 2e 57 68 65 72 65 28 69 20 3d 3e 20 69 2e 4f 72  .Where(i => i.Or
5270: 64 65 72 44 61 74 65 20 3d 3d 20 64 61 74 65 54  derDate == dateT
5280: 69 6d 65 29 2e 43 6f 75 6e 74 28 29 3b 0d 0a 20  ime).Count();.. 
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
52a0: 75 72 6e 20 63 31 20 3d 3d 20 63 32 20 3f 20 30  urn c1 == c2 ? 0
52b0: 20 3a 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20   : 1;..         
52c0: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
52d0: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
52e0: 74 69 63 20 76 6f 69 64 20 44 61 74 65 54 69 6d  tic void DateTim
52f0: 65 54 65 73 74 32 28 0d 0a 20 20 20 20 20 20 20  eTest2(..       
5300: 20 20 20 73 74 72 69 6e 67 20 64 61 74 65 54 69     string dateTi
5310: 6d 65 46 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20  meFormat..      
5320: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 7b 0d 0a      )..      {..
5330: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4c            TraceL
5340: 69 73 74 65 6e 65 72 20 6c 69 73 74 65 6e 65 72  istener listener
5350: 20 3d 20 6e 65 77 20 43 6f 6e 73 6f 6c 65 54 72   = new ConsoleTr
5360: 61 63 65 4c 69 73 74 65 6e 65 72 28 29 3b 0d 0a  aceListener();..
5370: 0d 0a 20 20 20 20 20 20 20 20 20 20 54 72 61 63  ..          Trac
5380: 65 2e 4c 69 73 74 65 6e 65 72 73 2e 41 64 64 28  e.Listeners.Add(
5390: 6c 69 73 74 65 6e 65 72 29 3b 0d 0a 20 20 20 20  listener);..    
53a0: 20 20 20 20 20 20 45 6e 76 69 72 6f 6e 6d 65 6e        Environmen
53b0: 74 2e 53 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74  t.SetEnvironment
53c0: 56 61 72 69 61 62 6c 65 28 22 53 51 4c 69 74 65  Variable("SQLite
53d0: 5f 46 6f 72 63 65 4c 6f 67 50 72 65 70 61 72 65  _ForceLogPrepare
53e0: 22 2c 20 22 31 22 29 3b 0d 0a 0d 0a 20 20 20 20  ", "1");....    
53f0: 20 20 20 20 20 20 69 66 20 28 64 61 74 65 54 69        if (dateTi
5400: 6d 65 46 6f 72 6d 61 74 20 21 3d 20 6e 75 6c 6c  meFormat != null
5410: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 6e                En
5430: 76 69 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76  vironment.SetEnv
5440: 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
5450: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
5460: 20 20 20 20 20 22 41 70 70 65 6e 64 4d 61 6e 69       "AppendMani
5470: 66 65 73 74 54 6f 6b 65 6e 5f 53 51 4c 69 74 65  festToken_SQLite
5480: 50 72 6f 76 69 64 65 72 4d 61 6e 69 66 65 73 74  ProviderManifest
5490: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
54a0: 20 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f 72        String.For
54b0: 6d 61 74 28 22 3b 44 61 74 65 54 69 6d 65 46 6f  mat(";DateTimeFo
54c0: 72 6d 61 74 3d 7b 30 7d 3b 22 2c 20 64 61 74 65  rmat={0};", date
54d0: 54 69 6d 65 46 6f 72 6d 61 74 29 29 3b 0d 0a 20  TimeFormat));.. 
54e0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
54f0: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e          using (n
5500: 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69  orthwindEFEntiti
5510: 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74  es db = new nort
5520: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28  hwindEFEntities(
5530: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
5540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
5550: 62 2e 4f 72 64 65 72 73 2e 57 68 65 72 65 28 69  b.Orders.Where(i
5560: 20 3d 3e 20 69 2e 4f 72 64 65 72 44 61 74 65 20   => i.OrderDate 
5570: 3c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <..             
5580: 20 20 20 20 20 6e 65 77 20 44 61 74 65 54 69 6d       new DateTim
5590: 65 28 31 39 39 37 2c 20 31 2c 20 31 2c 20 30 2c  e(1997, 1, 1, 0,
55a0: 20 30 2c 20 30 2c 20 44 61 74 65 54 69 6d 65 4b   0, 0, DateTimeK
55b0: 69 6e 64 2e 4c 6f 63 61 6c 29 29 2e 43 6f 75 6e  ind.Local)).Coun
55c0: 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  t();..          
55d0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69  }....          i
55e0: 66 20 28 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  f (dateTimeForma
55f0: 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  t != null)..    
5600: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5610: 20 20 20 20 20 20 20 45 6e 76 69 72 6f 6e 6d 65         Environme
5620: 6e 74 2e 53 65 74 45 6e 76 69 72 6f 6e 6d 65 6e  nt.SetEnvironmen
5630: 74 56 61 72 69 61 62 6c 65 28 0d 0a 20 20 20 20  tVariable(..    
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
5650: 70 70 65 6e 64 4d 61 6e 69 66 65 73 74 54 6f 6b  ppendManifestTok
5660: 65 6e 5f 53 51 4c 69 74 65 50 72 6f 76 69 64 65  en_SQLiteProvide
5670: 72 4d 61 6e 69 66 65 73 74 22 2c 0d 0a 20 20 20  rManifest",..   
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
5690: 75 6c 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ull);..         
56a0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
56b0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 53 65 74 45  Environment.SetE
56c0: 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62  nvironmentVariab
56d0: 6c 65 28 22 53 51 4c 69 74 65 5f 46 6f 72 63 65  le("SQLite_Force
56e0: 4c 6f 67 50 72 65 70 61 72 65 22 2c 20 6e 75 6c  LogPrepare", nul
56f0: 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 54  l);..          T
5700: 72 61 63 65 2e 4c 69 73 74 65 6e 65 72 73 2e 52  race.Listeners.R
5710: 65 6d 6f 76 65 28 6c 69 73 74 65 6e 65 72 29 3b  emove(listener);
5720: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
5730: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
5740: 69 6e 74 20 4f 6c 64 54 65 73 74 73 28 29 0d 0a  int OldTests()..
5750: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 75 73 69      {..      usi
5760: 6e 67 20 28 6e 6f 72 74 68 77 69 6e 64 45 46 45  ng (northwindEFE
5770: 6e 74 69 74 69 65 73 20 64 62 20 3d 20 6e 65 77  ntities db = new
5780: 20 6e 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69   northwindEFEnti
5790: 74 69 65 73 28 29 29 0d 0a 20 20 20 20 20 20 7b  ties())..      {
57a0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
57b0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 65 6e         string en
57c0: 74 69 74 79 53 51 4c 20 3d 20 22 53 45 4c 45 43  titySQL = "SELEC
57d0: 54 20 56 41 4c 55 45 20 6f 20 46 52 4f 4d 20 4f  T VALUE o FROM O
57e0: 72 64 65 72 73 20 41 53 20 6f 20 57 48 45 52 45  rders AS o WHERE
57f0: 20 53 51 4c 69 74 65 2e 44 61 74 65 50 61 72 74   SQLite.DatePart
5800: 28 27 79 79 79 79 27 2c 20 6f 2e 4f 72 64 65 72  ('yyyy', o.Order
5810: 44 61 74 65 29 20 3d 20 31 39 39 37 20 4f 52 44  Date) = 1997 ORD
5820: 45 52 20 42 59 20 6f 2e 4f 72 64 65 72 49 44 3b  ER BY o.OrderID;
5830: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 4f 62  ";..          Ob
5840: 6a 65 63 74 51 75 65 72 79 3c 4f 72 64 65 72 73  jectQuery<Orders
5850: 3e 20 71 75 65 72 79 20 3d 20 64 62 2e 43 72 65  > query = db.Cre
5860: 61 74 65 51 75 65 72 79 3c 4f 72 64 65 72 73 3e  ateQuery<Orders>
5870: 28 65 6e 74 69 74 79 53 51 4c 29 3b 0d 0a 0d 0a  (entitySQL);....
5880: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
5890: 68 20 28 4f 72 64 65 72 73 20 6f 20 69 6e 20 71  h (Orders o in q
58a0: 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20  uery)..         
58b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
58c0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
58d0: 65 28 6f 2e 53 68 69 70 50 6f 73 74 61 6c 43 6f  e(o.ShipPostalCo
58e0: 64 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  de);..          
58f0: 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  }..        }....
5900: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
5910: 20 20 20 20 20 76 61 72 20 71 75 65 72 79 20 3d       var query =
5920: 20 66 72 6f 6d 20 63 20 69 6e 20 64 62 2e 43 75   from c in db.Cu
5930: 73 74 6f 6d 65 72 73 0d 0a 20 20 20 20 20 20 20  stomers..       
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
5950: 68 65 72 65 20 63 2e 43 69 74 79 20 3d 3d 20 22  here c.City == "
5960: 4c 6f 6e 64 6f 6e 22 0d 0a 20 20 20 20 20 20 20  London"..       
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5980: 72 64 65 72 62 79 20 63 2e 43 6f 6d 70 61 6e 79  rderby c.Company
5990: 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 65              sele
59b0: 63 74 20 63 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ct c;....       
59c0: 20 20 20 69 6e 74 20 63 63 20 3d 20 71 75 65 72     int cc = quer
59d0: 79 2e 43 6f 75 6e 74 28 29 3b 0d 0a 0d 0a 20 20  y.Count();....  
59e0: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
59f0: 28 43 75 73 74 6f 6d 65 72 73 20 63 20 69 6e 20  (Customers c in 
5a00: 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20 20  query)..        
5a10: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
5a20: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
5a30: 6e 65 28 63 2e 43 6f 6d 70 61 6e 79 4e 61 6d 65  ne(c.CompanyName
5a40: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
5a50: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
5a60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5a70: 20 20 20 73 74 72 69 6e 67 20 73 63 69 74 79 20     string scity 
5a80: 3d 20 22 4c 6f 6e 64 6f 6e 22 3b 0d 0a 20 20 20  = "London";..   
5a90: 20 20 20 20 20 20 20 43 75 73 74 6f 6d 65 72 73         Customers
5aa0: 20 63 20 3d 20 64 62 2e 43 75 73 74 6f 6d 65 72   c = db.Customer
5ab0: 73 2e 46 69 72 73 74 4f 72 44 65 66 61 75 6c 74  s.FirstOrDefault
5ac0: 28 63 64 20 3d 3e 20 63 64 2e 43 69 74 79 20 3d  (cd => cd.City =
5ad0: 3d 20 73 63 69 74 79 29 3b 0d 0a 20 20 20 20 20  = scity);..     
5ae0: 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69       Console.Wri
5af0: 74 65 4c 69 6e 65 28 63 2e 43 6f 6d 70 61 6e 79  teLine(c.Company
5b00: 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  Name);..        
5b10: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  }....        {..
5b20: 20 20 20 20 20 20 20 20 20 20 44 61 74 65 54 69            DateTi
5b30: 6d 65 20 64 74 20 3d 20 6e 65 77 20 44 61 74 65  me dt = new Date
5b40: 54 69 6d 65 28 31 39 39 37 2c 20 31 2c 20 31 29  Time(1997, 1, 1)
5b50: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 76 61 72  ;..          var
5b60: 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 6f 72   query = from or
5b70: 64 65 72 20 69 6e 20 64 62 2e 4f 72 64 65 72 73  der in db.Orders
5b80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5b90: 20 20 20 20 20 20 20 20 77 68 65 72 65 20 6f 72          where or
5ba0: 64 65 72 2e 4f 72 64 65 72 44 61 74 65 20 3c 20  der.OrderDate < 
5bb0: 64 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  dt..            
5bc0: 20 20 20 20 20 20 20 20 20 20 6f 72 64 65 72 62            orderb
5bd0: 79 20 6f 72 64 65 72 2e 4f 72 64 65 72 49 44 0d  y order.OrderID.
5be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5bf0: 20 20 20 20 20 20 20 73 65 6c 65 63 74 20 6f 72         select or
5c00: 64 65 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  der;....        
5c10: 20 20 66 6f 72 65 61 63 68 20 28 4f 72 64 65 72    foreach (Order
5c20: 73 20 6f 20 69 6e 20 71 75 65 72 79 29 0d 0a 20  s o in query).. 
5c30: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5c40: 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e          Console.
5c50: 57 72 69 74 65 4c 69 6e 65 28 6f 2e 4f 72 64 65  WriteLine(o.Orde
5c60: 72 44 61 74 65 2e 54 6f 53 74 72 69 6e 67 28 29  rDate.ToString()
5c70: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
5c80: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
5c90: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5ca0: 20 20 20 43 61 74 65 67 6f 72 69 65 73 20 63 20     Categories c 
5cb0: 3d 20 6e 65 77 20 43 61 74 65 67 6f 72 69 65 73  = new Categories
5cc0: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  ();..          c
5cd0: 2e 43 61 74 65 67 6f 72 79 4e 61 6d 65 20 3d 20  .CategoryName = 
5ce0: 22 54 65 73 74 20 43 61 74 65 67 6f 72 79 22 3b  "Test Category";
5cf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 2e 44 65  ..          c.De
5d00: 73 63 72 69 70 74 69 6f 6e 20 3d 20 22 4d 79 20  scription = "My 
5d10: 44 65 73 63 72 69 70 74 69 6f 6e 22 3b 0d 0a 20  Description";.. 
5d20: 20 20 20 20 20 20 20 20 20 64 62 2e 41 64 64 54           db.AddT
5d30: 6f 43 61 74 65 67 6f 72 69 65 73 28 63 29 3b 0d  oCategories(c);.
5d40: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2e 53 61  .          db.Sa
5d50: 76 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a 0d 0a  veChanges();....
5d60: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
5d70: 65 2e 57 72 69 74 65 4c 69 6e 65 28 63 2e 43 61  e.WriteLine(c.Ca
5d80: 74 65 67 6f 72 79 49 44 29 3b 0d 0a 0d 0a 20 20  tegoryID);....  
5d90: 20 20 20 20 20 20 20 20 63 2e 44 65 73 63 72 69          c.Descri
5da0: 70 74 69 6f 6e 20 3d 20 22 4d 79 20 6d 6f 64 69  ption = "My modi
5db0: 66 69 65 64 20 64 65 73 63 72 69 70 74 69 6f 6e  fied description
5dc0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64 62  ";..          db
5dd0: 2e 53 61 76 65 43 68 61 6e 67 65 73 28 29 3b 0d  .SaveChanges();.
5de0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 64 62 2e  ...          db.
5df0: 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 63 29 3b  DeleteObject(c);
5e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 64 62 2e 53  ..          db.S
5e10: 61 76 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a 20  aveChanges();.. 
5e20: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
5e30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5e40: 20 43 75 73 74 6f 6d 65 72 73 20 63 75 73 74 20   Customers cust 
5e50: 3d 20 6e 65 77 20 43 75 73 74 6f 6d 65 72 73 28  = new Customers(
5e60: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 75  );..          cu
5e70: 73 74 2e 43 75 73 74 6f 6d 65 72 49 44 20 3d 20  st.CustomerID = 
5e80: 22 4d 54 4d 54 4d 22 3b 0d 0a 20 20 20 20 20 20  "MTMTM";..      
5e90: 20 20 20 20 63 75 73 74 2e 43 6f 6e 74 61 63 74      cust.Contact
5ea0: 4e 61 6d 65 20 3d 20 22 4d 79 20 4e 61 6d 65 22  Name = "My Name"
5eb0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 75 73  ;..          cus
5ec0: 74 2e 43 6f 6d 70 61 6e 79 4e 61 6d 65 20 3d 20  t.CompanyName = 
5ed0: 22 53 51 4c 69 74 65 20 43 6f 6d 70 61 6e 79 22  "SQLite Company"
5ee0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 75 73  ;..          cus
5ef0: 74 2e 43 6f 75 6e 74 72 79 20 3d 20 22 4e 65 74  t.Country = "Net
5f00: 68 65 72 6c 61 6e 64 73 22 3b 0d 0a 20 20 20 20  herlands";..    
5f10: 20 20 20 20 20 20 63 75 73 74 2e 43 69 74 79 20        cust.City 
5f20: 3d 20 22 41 6d 73 74 65 72 64 61 6d 22 3b 0d 0a  = "Amsterdam";..
5f30: 20 20 20 20 20 20 20 20 20 20 63 75 73 74 2e 50            cust.P
5f40: 68 6f 6e 65 20 3d 20 22 30 31 32 33 34 35 36 37  hone = "01234567
5f50: 37 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64  7";..          d
5f60: 62 2e 41 64 64 54 6f 43 75 73 74 6f 6d 65 72 73  b.AddToCustomers
5f70: 28 63 75 73 74 29 3b 0d 0a 20 20 20 20 20 20 20  (cust);..       
5f80: 20 20 20 64 62 2e 53 61 76 65 43 68 61 6e 67 65     db.SaveChange
5f90: 73 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  s();....        
5fa0: 20 20 64 62 2e 44 65 6c 65 74 65 4f 62 6a 65 63    db.DeleteObjec
5fb0: 74 28 63 75 73 74 29 3b 0d 0a 20 20 20 20 20 20  t(cust);..      
5fc0: 20 20 20 20 64 62 2e 53 61 76 65 43 68 61 6e 67      db.SaveChang
5fd0: 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  es();..        }
5fe0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ....        {.. 
5ff0: 20 20 20 20 20 20 20 20 20 76 61 72 20 71 75 65           var que
6000: 72 79 20 3d 20 64 62 2e 43 75 73 74 6f 6d 65 72  ry = db.Customer
6010: 73 2e 57 68 65 72 65 28 63 75 73 74 20 3d 3e 20  s.Where(cust => 
6020: 63 75 73 74 2e 43 6f 75 6e 74 72 79 20 3d 3d 20  cust.Country == 
6030: 22 44 65 6e 6d 61 72 6b 22 29 0d 0a 20 20 20 20  "Denmark")..    
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 20 20 20 2e 53 65 6c 65 63 74 4d 61 6e        .SelectMan
6060: 79 28 63 75 73 74 20 3d 3e 20 63 75 73 74 2e 4f  y(cust => cust.O
6070: 72 64 65 72 73 2e 57 68 65 72 65 28 6f 20 3d 3e  rders.Where(o =>
6080: 20 6f 2e 46 72 65 69 67 68 74 20 3e 20 35 29 29   o.Freight > 5))
6090: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 2e 4f 72 64              .Ord
60b0: 65 72 42 79 28 6f 20 3d 3e 20 6f 2e 43 75 73 74  erBy(o => o.Cust
60c0: 6f 6d 65 72 73 2e 43 75 73 74 6f 6d 65 72 49 44  omers.CustomerID
60d0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
60e0: 66 6f 72 65 61 63 68 20 28 4f 72 64 65 72 73 20  foreach (Orders 
60f0: 63 20 69 6e 20 71 75 65 72 79 29 0d 0a 20 20 20  c in query)..   
6100: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
6110: 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72        Console.Wr
6120: 69 74 65 4c 69 6e 65 28 63 2e 46 72 65 69 67 68  iteLine(c.Freigh
6130: 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  t);..          }
6140: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
6150: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
6160: 20 20 20 20 76 61 72 20 71 75 65 72 79 20 3d 20      var query = 
6170: 66 72 6f 6d 20 63 20 69 6e 20 64 62 2e 43 75 73  from c in db.Cus
6180: 74 6f 6d 65 72 73 0d 0a 20 20 20 20 20 20 20 20  tomers..        
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
61a0: 65 72 65 20 63 2e 4f 72 64 65 72 73 2e 41 6e 79  ere c.Orders.Any
61b0: 28 6f 20 3d 3e 20 6f 2e 4f 72 64 65 72 44 61 74  (o => o.OrderDat
61c0: 65 2e 48 61 73 56 61 6c 75 65 20 3d 3d 20 74 72  e.HasValue == tr
61d0: 75 65 20 26 26 20 6f 2e 4f 72 64 65 72 44 61 74  ue && o.OrderDat
61e0: 65 2e 56 61 6c 75 65 2e 59 65 61 72 20 3d 3d 20  e.Value.Year == 
61f0: 31 39 39 37 29 0d 0a 20 20 20 20 20 20 20 20 20  1997)..         
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 64               ord
6210: 65 72 62 79 20 63 2e 43 75 73 74 6f 6d 65 72 49  erby c.CustomerI
6220: 44 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D..             
6230: 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 20           select 
6240: 63 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  c;....          
6250: 66 6f 72 65 61 63 68 20 28 43 75 73 74 6f 6d 65  foreach (Custome
6260: 72 73 20 63 20 69 6e 20 71 75 65 72 79 29 0d 0a  rs c in query)..
6270: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
6280: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
6290: 2e 57 72 69 74 65 4c 69 6e 65 28 63 2e 43 6f 6d  .WriteLine(c.Com
62a0: 70 61 6e 79 4e 61 6d 65 29 3b 0d 0a 20 20 20 20  panyName);..    
62b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
62c0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b 0d   }....        {.
62d0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e  .          strin
62e0: 67 20 65 6e 74 69 74 79 53 51 4c 20 3d 20 22 53  g entitySQL = "S
62f0: 45 4c 45 43 54 20 56 41 4c 55 45 20 6f 20 46 52  ELECT VALUE o FR
6300: 4f 4d 20 4f 72 64 65 72 73 20 41 53 20 6f 20 57  OM Orders AS o W
6310: 48 45 52 45 20 6f 2e 43 75 73 74 6f 6d 65 72 73  HERE o.Customers
6320: 2e 43 6f 75 6e 74 72 79 20 3c 3e 20 27 55 4b 27  .Country <> 'UK'
6330: 20 41 4e 44 20 6f 2e 43 75 73 74 6f 6d 65 72 73   AND o.Customers
6340: 2e 43 6f 75 6e 74 72 79 20 3c 3e 20 27 4d 65 78  .Country <> 'Mex
6350: 69 63 6f 27 20 41 4e 44 20 59 65 61 72 28 6f 2e  ico' AND Year(o.
6360: 4f 72 64 65 72 44 61 74 65 29 20 3d 20 31 39 39  OrderDate) = 199
6370: 37 20 4f 52 44 45 52 20 42 59 20 6f 2e 4f 72 64  7 ORDER BY o.Ord
6380: 65 72 49 44 3b 22 3b 0d 0a 20 20 20 20 20 20 20  erID;";..       
6390: 20 20 20 4f 62 6a 65 63 74 51 75 65 72 79 3c 4f     ObjectQuery<O
63a0: 72 64 65 72 73 3e 20 71 75 65 72 79 20 3d 20 64  rders> query = d
63b0: 62 2e 43 72 65 61 74 65 51 75 65 72 79 3c 4f 72  b.CreateQuery<Or
63c0: 64 65 72 73 3e 28 65 6e 74 69 74 79 53 51 4c 29  ders>(entitySQL)
63d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 66  ;....          f
63e0: 6f 72 65 61 63 68 20 28 4f 72 64 65 72 73 20 6f  oreach (Orders o
63f0: 20 69 6e 20 71 75 65 72 79 29 0d 0a 20 20 20 20   in query)..    
6400: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6410: 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69       Console.Wri
6420: 74 65 4c 69 6e 65 28 6f 2e 53 68 69 70 50 6f 73  teLine(o.ShipPos
6430: 74 61 6c 43 6f 64 65 29 3b 0d 0a 20 20 20 20 20  talCode);..     
6440: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6450: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  }....        {..
6460: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
6470: 20 65 6e 74 69 74 79 53 51 4c 20 3d 20 22 53 45   entitySQL = "SE
6480: 4c 45 43 54 20 56 41 4c 55 45 20 6f 20 46 52 4f  LECT VALUE o FRO
6490: 4d 20 4f 72 64 65 72 73 20 41 53 20 6f 20 57 48  M Orders AS o WH
64a0: 45 52 45 20 4e 65 77 47 75 69 64 28 29 20 3c 3e  ERE NewGuid() <>
64b0: 20 4e 65 77 47 75 69 64 28 29 20 4f 52 44 45 52   NewGuid() ORDER
64c0: 20 42 59 20 6f 2e 4f 72 64 65 72 49 44 3b 22 3b   BY o.OrderID;";
64d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 4f 62 6a 65  ..          Obje
64e0: 63 74 51 75 65 72 79 3c 4f 72 64 65 72 73 3e 20  ctQuery<Orders> 
64f0: 71 75 65 72 79 20 3d 20 64 62 2e 43 72 65 61 74  query = db.Creat
6500: 65 51 75 65 72 79 3c 4f 72 64 65 72 73 3e 28 65  eQuery<Orders>(e
6510: 6e 74 69 74 79 53 51 4c 29 3b 0d 0a 0d 0a 20 20  ntitySQL);....  
6520: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
6530: 28 4f 72 64 65 72 73 20 6f 20 69 6e 20 71 75 65  (Orders o in que
6540: 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ry)..          {
6550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ..            Co
6560: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
6570: 6f 2e 53 68 69 70 50 6f 73 74 61 6c 43 6f 64 65  o.ShipPostalCode
6580: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
6590: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
65a0: 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20 71 75        // This qu
65b0: 65 72 79 20 72 65 71 75 69 72 65 73 20 53 51 4c  ery requires SQL
65c0: 69 74 65 20 33 2e 36 2e 32 20 74 6f 20 66 75 6e  ite 3.6.2 to fun
65d0: 63 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 0d  ction correctly.
65e0: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
65f0: 20 20 20 20 20 20 76 61 72 20 71 75 65 72 79 20        var query 
6600: 3d 20 66 72 6f 6d 20 70 20 69 6e 20 64 62 2e 50  = from p in db.P
6610: 72 6f 64 75 63 74 73 0d 0a 20 20 20 20 20 20 20  roducts..       
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
6630: 68 65 72 65 20 70 2e 4f 72 64 65 72 44 65 74 61  here p.OrderDeta
6640: 69 6c 73 2e 43 6f 75 6e 74 28 6f 64 20 3d 3e 20  ils.Count(od => 
6650: 6f 64 2e 4f 72 64 65 72 73 2e 43 75 73 74 6f 6d  od.Orders.Custom
6660: 65 72 73 2e 43 6f 75 6e 74 72 79 20 3d 3d 20 70  ers.Country == p
6670: 2e 53 75 70 70 6c 69 65 72 73 2e 43 6f 75 6e 74  .Suppliers.Count
6680: 72 79 29 20 3e 20 32 0d 0a 20 20 20 20 20 20 20  ry) > 2..       
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
66a0: 72 64 65 72 62 79 20 70 2e 50 72 6f 64 75 63 74  rderby p.Product
66b0: 49 44 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ID..            
66c0: 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
66d0: 20 70 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   p;....         
66e0: 20 66 6f 72 65 61 63 68 20 28 50 72 6f 64 75 63   foreach (Produc
66f0: 74 73 20 70 20 69 6e 20 71 75 65 72 79 29 0d 0a  ts p in query)..
6700: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
6710: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
6720: 2e 57 72 69 74 65 4c 69 6e 65 28 70 2e 50 72 6f  .WriteLine(p.Pro
6730: 64 75 63 74 4e 61 6d 65 29 3b 0d 0a 20 20 20 20  ductName);..    
6740: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6750: 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20   }..      }.... 
6760: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 2f       //..      /
6770: 2f 20 4e 4f 54 45 3a 20 28 4a 4a 4d 29 20 52 65  / NOTE: (JJM) Re
6780: 6d 6f 76 65 64 20 6f 6e 20 32 30 31 31 2f 30 37  moved on 2011/07
6790: 2f 30 36 2c 20 6d 61 6b 65 73 20 69 74 20 68 61  /06, makes it ha
67a0: 72 64 65 72 20 74 6f 20 72 75 6e 20 74 68 69 73  rder to run this
67b0: 20 45 58 45 20 76 69 61 0d 0a 20 20 20 20 20 20   EXE via..      
67c0: 2f 2f 20 20 20 20 20 20 20 74 68 65 20 6e 65 77  //       the new
67d0: 20 75 6e 69 74 20 74 65 73 74 20 73 75 69 74 65   unit test suite
67e0: 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20  ...      //..   
67f0: 20 20 20 2f 2f 20 43 6f 6e 73 6f 6c 65 2e 52 65     // Console.Re
6800: 61 64 4b 65 79 28 29 3b 0d 0a 0d 0a 20 20 20 20  adKey();....    
6810: 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20    return 0;..   
6820: 20 7d 0d 0a 20 20 7d 0d 0a 7d 0d 0a               }..  }..}..