System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 343dfb75259e875a161444370740f82eb2941f56:


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 43 6f 6c 6c 65 63 74 69 6f 6e 73 2e 47 65  m.Collections.Ge
0150: 6e 65 72 69 63 3b 0d 0a 75 73 69 6e 67 20 53 79  neric;..using Sy
0160: 73 74 65 6d 2e 44 61 74 61 3b 0d 0a 75 73 69 6e  stem.Data;..usin
0170: 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 43 6f  g System.Data.Co
0180: 6d 6d 6f 6e 3b 0d 0a 75 73 69 6e 67 20 53 79 73  mmon;..using Sys
0190: 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 3b  tem.Diagnostics;
01a0: 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 4c  ..using System.L
01b0: 69 6e 71 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74  inq;..using Syst
01c0: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 3b 0d 0a  em.Reflection;..
01d0: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 54 65 78  using System.Tex
01e0: 74 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d  t;..using System
01f0: 2e 54 72 61 6e 73 61 63 74 69 6f 6e 73 3b 0d 0a  .Transactions;..
0200: 0d 0a 23 69 66 20 55 53 45 5f 45 4e 54 49 54 59  ..#if USE_ENTITY
0210: 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 0d 0a 75 73  _FRAMEWORK_6..us
0220: 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e  ing System.Data.
0230: 45 6e 74 69 74 79 2e 43 6f 72 65 2e 45 6e 74 69  Entity.Core.Enti
0240: 74 79 43 6c 69 65 6e 74 3b 0d 0a 75 73 69 6e 67  tyClient;..using
0250: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 45 6e 74   System.Data.Ent
0260: 69 74 79 2e 43 6f 72 65 2e 4f 62 6a 65 63 74 73  ity.Core.Objects
0270: 3b 0d 0a 23 65 6c 73 65 0d 0a 75 73 69 6e 67 20  ;..#else..using 
0280: 53 79 73 74 65 6d 2e 44 61 74 61 2e 45 6e 74 69  System.Data.Enti
0290: 74 79 43 6c 69 65 6e 74 3b 0d 0a 75 73 69 6e 67  tyClient;..using
02a0: 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 4f 62 6a   System.Data.Obj
02b0: 65 63 74 73 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d  ects;..#endif...
02c0: 0a 6e 61 6d 65 73 70 61 63 65 20 74 65 73 74 6c  .namespace testl
02d0: 69 6e 71 0d 0a 7b 0d 0a 20 20 63 6c 61 73 73 20  inq..{..  class 
02e0: 50 72 6f 67 72 61 6d 0d 0a 20 20 7b 0d 0a 20 20  Program..  {..  
02f0: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
0300: 69 63 20 69 6e 74 20 4d 61 69 6e 28 73 74 72 69  ic int Main(stri
0310: 6e 67 5b 5d 20 61 72 67 73 29 0d 0a 20 20 20 20  ng[] args)..    
0320: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 69    {..          i
0330: 66 20 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 47  f (Environment.G
0340: 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72  etEnvironmentVar
0350: 69 61 62 6c 65 28 22 42 52 45 41 4b 22 29 20 21  iable("BREAK") !
0360: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
0370: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
0380: 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74      Console.Writ
0390: 65 4c 69 6e 65 28 0d 0a 20 20 20 20 20 20 20 20  eLine(..        
03a0: 20 20 20 20 20 20 20 20 20 20 22 41 74 74 61 63            "Attac
03b0: 68 20 61 20 64 65 62 75 67 67 65 72 20 74 6f 20  h a debugger to 
03c0: 70 72 6f 63 65 73 73 20 7b 30 7d 20 61 6e 64 20  process {0} and 
03d0: 70 72 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f  press any key to
03e0: 20 63 6f 6e 74 69 6e 75 65 2e 22 2c 0d 0a 20 20   continue.",..  
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 50 72 6f 63 65 73 73 2e 47 65 74 43 75 72 72 65  Process.GetCurre
0410: 6e 74 50 72 6f 63 65 73 73 28 29 2e 49 64 29 3b  ntProcess().Id);
0420: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
0430: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
0440: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0450: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
0460: 65 2e 52 65 61 64 4b 65 79 28 74 72 75 65 29 3b  e.ReadKey(true);
0470: 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20   /* throw */..  
0480: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
04a0: 63 68 20 28 49 6e 76 61 6c 69 64 4f 70 65 72 61  ch (InvalidOpera
04b0: 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 29 20 2f  tionException) /
04c0: 2f 20 43 6f 6e 73 6f 6c 65 2e 52 65 61 64 4b 65  / Console.ReadKe
04d0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
04e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
04f0: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
0500: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
0510: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
0520: 20 20 20 20 20 20 20 44 65 62 75 67 67 65 72 2e         Debugger.
0530: 42 72 65 61 6b 28 29 3b 0d 0a 20 20 20 20 20 20  Break();..      
0540: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
0550: 20 20 20 73 74 72 69 6e 67 20 61 72 67 20 3d 20     string arg = 
0560: 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
0570: 20 20 20 69 66 20 28 28 61 72 67 73 20 21 3d 20     if ((args != 
0580: 6e 75 6c 6c 29 20 26 26 20 28 61 72 67 73 2e 4c  null) && (args.L
0590: 65 6e 67 74 68 20 3e 20 30 29 29 0d 0a 20 20 20  ength > 0))..   
05a0: 20 20 20 20 20 20 20 20 20 20 20 61 72 67 20 3d             arg =
05b0: 20 61 72 67 73 5b 30 5d 3b 0d 0a 0d 0a 20 20 20   args[0];....   
05c0: 20 20 20 20 20 20 20 69 66 20 28 61 72 67 20 3d         if (arg =
05d0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
05e0: 20 20 20 20 20 20 20 61 72 67 20 3d 20 22 22 3b         arg = "";
05f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 61 72  ....          ar
0600: 67 20 3d 20 61 72 67 2e 54 72 69 6d 28 29 2e 54  g = arg.Trim().T
0610: 72 69 6d 53 74 61 72 74 28 27 2d 27 2c 20 27 2f  rimStart('-', '/
0620: 27 29 2e 54 6f 4c 6f 77 65 72 49 6e 76 61 72 69  ').ToLowerInvari
0630: 61 6e 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ant();....      
0640: 20 20 20 20 73 77 69 74 63 68 20 28 61 72 67 29      switch (arg)
0650: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
0670: 65 20 22 22 3a 20 2f 2f 20 53 74 72 69 6e 67 2e  e "": // String.
0680: 45 6d 70 74 79 0d 0a 20 20 20 20 20 20 20 20 20  Empty..         
0690: 20 20 20 20 20 63 61 73 65 20 22 6f 6c 64 22 3a       case "old":
06a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
06b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
06d0: 75 72 6e 20 4f 6c 64 54 65 73 74 73 28 29 3b 0d  urn OldTests();.
06e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
06f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
0700: 20 20 20 20 63 61 73 65 20 22 64 61 74 65 74 69      case "dateti
0710: 6d 65 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  me":..          
0720: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 72 65 74 75 72 6e 20 44 61 74 65 54 69 6d 65   return DateTime
0750: 54 65 73 74 28 29 3b 0d 0a 20 20 20 20 20 20 20  Test();..       
0760: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
0770: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
0780: 20 22 64 61 74 65 74 69 6d 65 32 22 3a 0d 0a 20   "datetime2":.. 
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 7b 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 73 74 72 69 6e 67            string
07c0: 20 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20   dateTimeFormat 
07d0: 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  = null;....     
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 69 66 20 28 61 72 67 73 2e 4c 65 6e 67 74 68   if (args.Length
0800: 20 3e 20 31 29 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 20 20 20                  
0820: 20 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20   dateTimeFormat 
0830: 3d 20 61 72 67 73 5b 31 5d 3b 0d 0a 0d 0a 20 20  = args[1];....  
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 44 61 74 65 54 69 6d 65 54 65 73 74      DateTimeTest
0860: 32 28 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74  2(dateTimeFormat
0870: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
0880: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
0890: 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0;..           
08a0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
08b0: 20 20 20 20 20 20 20 20 63 61 73 65 20 22 73 6b          case "sk
08c0: 69 70 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  ip":..          
08d0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
08e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08f0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 20 3d 20   int pageSize = 
0900: 30 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  0;....          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0920: 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e 20 31 29  args.Length > 1)
0930: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0940: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 61 72 67 20 3d 20 61 72 67 73 5b       arg = args[
0970: 31 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  1];....         
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 69 66 20 28 61 72 67 20 21 3d 20 6e 75 6c 6c   if (arg != null
09a0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 70 61 67 65 53 69 7a 65 20 3d 20 69 6e 74 2e   pageSize = int.
09d0: 50 61 72 73 65 28 61 72 67 2e 54 72 69 6d 28 29  Parse(arg.Trim()
09e0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
09f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 6b 69 70       return Skip
0a20: 54 65 73 74 28 70 61 67 65 53 69 7a 65 29 3b 0d  Test(pageSize);.
0a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0a40: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
0a50: 20 20 20 20 63 61 73 65 20 22 73 75 62 73 74 72      case "substr
0a60: 69 6e 67 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  ing":..         
0a70: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 72 65 74 75 72 6e 20 53 75 62 53 74 72 69    return SubStri
0aa0: 6e 67 54 65 73 74 28 29 3b 0d 0a 20 20 20 20 20  ngTest();..     
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
0ac0: 23 69 66 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f  #if USE_INTEROP_
0ad0: 44 4c 4c 20 26 26 20 49 4e 54 45 52 4f 50 5f 45  DLL && INTEROP_E
0ae0: 58 54 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f  XTENSION_FUNCTIO
0af0: 4e 53 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  NS..            
0b00: 20 20 63 61 73 65 20 22 75 6e 69 6f 6e 61 6c 6c    case "unionall
0b10: 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ":..            
0b20: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
0b40: 65 74 75 72 6e 20 55 6e 69 6f 6e 41 6c 6c 54 65  eturn UnionAllTe
0b50: 73 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  st();..         
0b60: 20 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64           }..#end
0b70: 69 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  if..            
0b80: 20 20 63 61 73 65 20 22 65 6e 64 73 77 69 74 68    case "endswith
0b90: 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ":..            
0ba0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0bc0: 74 72 69 6e 67 20 76 61 6c 75 65 20 3d 20 6e 75  tring value = nu
0bd0: 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ll;....         
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
0bf0: 28 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e 20 31  (args.Length > 1
0c00: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
0c10: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 61 72        value = ar
0c40: 67 73 5b 31 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20  gs[1];....      
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 69 66 20 28 76 61 6c 75 65 20 21 3d      if (value !=
0c70: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 20 76 61 6c 75 65 20 3d 20 76 61        value = va
0ca0: 6c 75 65 2e 54 72 69 6d 28 29 3b 0d 0a 20 20 20  lue.Trim();..   
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
0ce0: 74 75 72 6e 20 45 6e 64 73 57 69 74 68 54 65 73  turn EndsWithTes
0cf0: 74 28 76 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20  t(value);..     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
0d20: 73 65 20 22 73 74 61 72 74 73 77 69 74 68 22 3a  se "startswith":
0d30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
0d40: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
0d60: 69 6e 67 20 76 61 6c 75 65 20 3d 20 6e 75 6c 6c  ing value = null
0d70: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
0d80: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61             if (a
0d90: 72 67 73 2e 4c 65 6e 67 74 68 20 3e 20 31 29 0d  rgs.Length > 1).
0da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0db0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 20 20 20 76 61 6c 75 65 20 3d 20 61 72 67 73      value = args
0de0: 5b 31 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  [1];....        
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 69 66 20 28 76 61 6c 75 65 20 21 3d 20 6e    if (value != n
0e10: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 76 61 6c 75 65 20 3d 20 76 61 6c 75      value = valu
0e40: 65 2e 54 72 69 6d 28 29 3b 0d 0a 20 20 20 20 20  e.Trim();..     
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
0e80: 72 6e 20 53 74 61 72 74 73 57 69 74 68 54 65 73  rn StartsWithTes
0e90: 74 28 76 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20  t(value);..     
0ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
0ec0: 73 65 20 22 65 66 74 72 61 6e 73 61 63 74 69 6f  se "eftransactio
0ed0: 6e 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n":..           
0ee0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 62 6f 6f 6c 20 76 61 6c 75 65 20 3d 20 66 61 6c  bool value = fal
0f10: 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
0f30: 28 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e 20 31  (args.Length > 1
0f40: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
0f50: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f70: 20 20 20 20 20 20 69 66 20 28 21 62 6f 6f 6c 2e        if (!bool.
0f80: 54 72 79 50 61 72 73 65 28 61 72 67 73 5b 31 5d  TryParse(args[1]
0f90: 2c 20 6f 75 74 20 76 61 6c 75 65 29 29 0d 0a 20  , out value)).. 
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 7b 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 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
0fe0: 65 2e 57 72 69 74 65 4c 69 6e 65 28 0d 0a 20 20  e.WriteLine(..  
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 22 63 61 6e 6e 6f 74 20 70 61 72 73 65 20 5c 22  "cannot parse \"
1020: 7b 30 7d 5c 22 20 61 73 20 62 6f 6f 6c 65 61 6e  {0}\" as boolean
1030: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1050: 20 20 20 20 20 20 61 72 67 73 5b 31 5d 29 3b 0d        args[1]);.
1060: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20   return 1;..    
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10e0: 20 45 46 54 72 61 6e 73 61 63 74 69 6f 6e 54 65   EFTransactionTe
10f0: 73 74 28 76 61 6c 75 65 29 3b 0d 0a 20 20 20 20  st(value);..    
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1110: 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c 20 4e  .#if NET_40 || N
1120: 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34 35 31  ET_45 || NET_451
1130: 20 7c 7c 20 4e 45 54 5f 34 36 0d 0a 20 20 20 20   || NET_46..    
1140: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22            case "
1150: 69 6e 73 65 72 74 22 3a 0d 0a 20 20 20 20 20 20  insert":..      
1160: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 72 65 74 75 72 6e 20 49 6e 73 65       return Inse
1190: 72 74 54 65 73 74 28 29 3b 0d 0a 20 20 20 20 20  rtTest();..     
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
11b0: 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20 20  #endif..        
11c0: 20 20 20 20 20 20 63 61 73 65 20 22 75 70 64 61        case "upda
11d0: 74 65 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  te":..          
11e0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 72 65 74 75 72 6e 20 55 70 64 61 74 65 54 65   return UpdateTe
1210: 73 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  st();..         
1220: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1230: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22            case "
1240: 62 69 6e 61 72 79 67 75 69 64 22 3a 0d 0a 20 20  binaryguid":..  
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1260: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1270: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 61           bool va
1280: 6c 75 65 20 3d 20 66 61 6c 73 65 3b 0d 0a 0d 0a  lue = false;....
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 20 69 66 20 28 61 72 67 73 2e 4c        if (args.L
12b0: 65 6e 67 74 68 20 3e 20 31 29 0d 0a 20 20 20 20  ength > 1)..    
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
12f0: 66 20 28 21 62 6f 6f 6c 2e 54 72 79 50 61 72 73  f (!bool.TryPars
1300: 65 28 61 72 67 73 5b 31 5d 2c 20 6f 75 74 20 76  e(args[1], out v
1310: 61 6c 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20  alue))..        
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
1360: 4c 69 6e 65 28 0d 0a 20 20 20 20 20 20 20 20 20  Line(..         
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
1390: 20 70 61 72 73 65 20 5c 22 7b 30 7d 5c 22 20 61   parse \"{0}\" a
13a0: 73 20 62 6f 6f 6c 65 61 6e 22 2c 0d 0a 20 20 20  s boolean",..   
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
13d0: 72 67 73 5b 31 5d 29 3b 0d 0a 0d 0a 20 20 20 20  rgs[1]);....    
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1400: 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1430: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 72 65 74 75 72 6e 20 42 69 6e 61 72 79     return Binary
1460: 47 75 69 64 54 65 73 74 28 76 61 6c 75 65 29 3b  GuidTest(value);
1470: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1480: 20 20 20 20 7d 0d 0a 23 69 66 20 4e 45 54 5f 34      }..#if NET_4
1490: 30 20 7c 7c 20 4e 45 54 5f 34 35 20 7c 7c 20 4e  0 || NET_45 || N
14a0: 45 54 5f 34 35 31 20 7c 7c 20 4e 45 54 5f 34 36  ET_451 || NET_46
14b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14c0: 63 61 73 65 20 22 62 69 6e 61 72 79 67 75 69 64  case "binaryguid
14d0: 32 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  2":..           
14e0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 62 6f 6f 6c 20 76 61 6c 75 65 20 3d 20 66 61 6c  bool value = fal
1510: 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1530: 28 61 72 67 73 2e 4c 65 6e 67 74 68 20 3e 20 31  (args.Length > 1
1540: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1550: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 69 66 20 28 21 62 6f 6f 6c 2e        if (!bool.
1580: 54 72 79 50 61 72 73 65 28 61 72 67 73 5b 31 5d  TryParse(args[1]
1590: 2c 20 6f 75 74 20 76 61 6c 75 65 29 29 0d 0a 20  , out value)).. 
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
15e0: 65 2e 57 72 69 74 65 4c 69 6e 65 28 0d 0a 20 20  e.WriteLine(..  
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 22 63 61 6e 6e 6f 74 20 70 61 72 73 65 20 5c 22  "cannot parse \"
1620: 7b 30 7d 5c 22 20 61 73 20 62 6f 6f 6c 65 61 6e  {0}\" as boolean
1630: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 61 72 67 73 5b 31 5d 29 3b 0d        args[1]);.
1660: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20   return 1;..    
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
16c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16e0: 20 42 69 6e 61 72 79 47 75 69 64 54 65 73 74 32   BinaryGuidTest2
16f0: 28 76 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20  (value);..      
1700: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 23              }..#
1710: 65 6e 64 69 66 0d 0a 23 69 66 20 4e 45 54 5f 34  endif..#if NET_4
1720: 30 20 7c 7c 20 4e 45 54 5f 34 35 20 7c 7c 20 4e  0 || NET_45 || N
1730: 45 54 5f 34 35 31 20 7c 7c 20 4e 45 54 5f 34 36  ET_451 || NET_46
1740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1750: 63 61 73 65 20 22 72 6f 75 6e 64 22 3a 0d 0a 20  case "round":.. 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1780: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1790: 20 52 6f 75 6e 64 54 65 73 74 28 29 3b 0d 0a 20   RoundTest();.. 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20   }..#endif..    
17c0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22            case "
17d0: 63 6f 6d 70 6c 65 78 70 72 69 6d 61 72 79 6b 65  complexprimaryke
17e0: 79 22 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y":..           
17f0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 72 65 74 75 72 6e 20 43 6f 6d 70 6c 65 78 50 72  return ComplexPr
1820: 69 6d 61 72 79 4b 65 79 54 65 73 74 28 29 3b 0d  imaryKeyTest();.
1830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1840: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1850: 20 20 20 20 64 65 66 61 75 6c 74 3a 0d 0a 20 20      default:..  
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1880: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
1890: 2e 57 72 69 74 65 4c 69 6e 65 28 22 75 6e 6b 6e  .WriteLine("unkn
18a0: 6f 77 6e 20 74 65 73 74 20 5c 22 7b 30 7d 5c 22  own test \"{0}\"
18b0: 22 2c 20 61 72 67 29 3b 0d 0a 20 20 20 20 20 20  ", arg);..      
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20 20  return 1;..     
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
18f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1900: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f     }....      //
1910: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
1920: 20 20 20 2f 2f 2f 20 41 74 74 65 6d 70 74 73 20     /// Attempts 
1930: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 75 6e  to obtain the un
1940: 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 65 20 63  derlying store c
1950: 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20 20  onnection..     
1960: 20 2f 2f 2f 20 28 61 20 3c 73 65 65 20 63 72 65   /// (a <see cre
1970: 66 3d 22 44 62 43 6f 6e 6e 65 63 74 69 6f 6e 22  f="DbConnection"
1980: 20 2f 3e 29 20 66 72 6f 6d 20 74 68 65 20 73 70   />) from the sp
1990: 65 63 69 66 69 65 64 0d 0a 20 20 20 20 20 20 2f  ecified..      /
19a0: 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 45 6e  // <see cref="En
19b0: 74 69 74 79 43 6f 6e 6e 65 63 74 69 6f 6e 22 20  tityConnection" 
19c0: 2f 3e 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  />...      /// <
19d0: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
19e0: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
19f0: 3d 22 65 6e 74 69 74 79 43 6f 6e 6e 65 63 74 69  ="entityConnecti
1a00: 6f 6e 22 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  on">..      /// 
1a10: 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 45  The <see cref="E
1a20: 6e 74 69 74 79 43 6f 6e 6e 65 63 74 69 6f 6e 22  ntityConnection"
1a30: 20 2f 3e 20 74 6f 20 75 73 65 2e 0d 0a 20 20 20   /> to use...   
1a40: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
1a50: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75  .      /// <retu
1a60: 72 6e 73 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20  rns>..      /// 
1a70: 54 68 65 20 3c 73 65 65 20 63 72 65 66 3d 22 44  The <see cref="D
1a80: 62 43 6f 6e 6e 65 63 74 69 6f 6e 22 20 2f 3e 20  bConnection" /> 
1a90: 2d 4f 52 2d 20 6e 75 6c 6c 20 69 66 20 69 74 0d  -OR- null if it.
1aa0: 0a 20 20 20 20 20 20 2f 2f 2f 20 63 61 6e 6e 6f  .      /// canno
1ab0: 74 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 2e  t be determined.
1ac0: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 72 65  ..      /// </re
1ad0: 74 75 72 6e 73 3e 0d 0a 20 20 20 20 20 20 70 72  turns>..      pr
1ae0: 69 76 61 74 65 20 73 74 61 74 69 63 20 44 62 43  ivate static DbC
1af0: 6f 6e 6e 65 63 74 69 6f 6e 20 47 65 74 53 74 6f  onnection GetSto
1b00: 72 65 43 6f 6e 6e 65 63 74 69 6f 6e 28 0d 0a 20  reConnection(.. 
1b10: 20 20 20 20 20 20 20 20 20 45 6e 74 69 74 79 43           EntityC
1b20: 6f 6e 6e 65 63 74 69 6f 6e 20 65 6e 74 69 74 79  onnection entity
1b30: 43 6f 6e 6e 65 63 74 69 6f 6e 0d 0a 20 20 20 20  Connection..    
1b40: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 7b        )..      {
1b50: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a  ..          //..
1b60: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
1b70: 45 3a 20 4e 6f 20 65 6e 74 69 74 79 20 63 6f 6e  E: No entity con
1b80: 6e 65 63 74 69 6f 6e 2c 20 6e 6f 20 73 74 6f 72  nection, no stor
1b90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0d 0a 20  e connection... 
1ba0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
1bb0: 20 20 20 20 20 20 20 69 66 20 28 65 6e 74 69 74         if (entit
1bc0: 79 43 6f 6e 6e 65 63 74 69 6f 6e 20 3d 3d 20 6e  yConnection == n
1bd0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1be0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
1bf0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  ....          //
1c00: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 48  ..          // H
1c10: 41 43 4b 3a 20 57 65 20 6e 65 65 64 20 74 68 65  ACK: We need the
1c20: 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
1c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
1c40: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20  ..          //  
1c50: 20 20 20 20 20 74 68 65 20 6c 65 67 61 63 79 20       the legacy 
1c60: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
1c70: 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 64  .NET Framework d
1c80: 6f 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20  o..          // 
1c90: 20 20 20 20 20 20 6e 6f 74 20 65 78 70 6f 73 65        not expose
1ca0: 20 69 74 3b 20 74 68 65 72 65 66 6f 72 65 2c 20   it; therefore, 
1cb0: 61 74 74 65 6d 70 74 20 74 6f 20 67 72 61 62 20  attempt to grab 
1cc0: 69 74 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  it..          //
1cd0: 20 20 20 20 20 20 20 62 79 20 66 6f 72 63 65 2e         by force.
1ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a  ..          //..
1cf0: 20 20 20 20 20 20 20 20 20 20 46 69 65 6c 64 49            FieldI
1d00: 6e 66 6f 20 66 69 65 6c 64 49 6e 66 6f 20 3d 20  nfo fieldInfo = 
1d10: 74 79 70 65 6f 66 28 45 6e 74 69 74 79 43 6f 6e  typeof(EntityCon
1d20: 6e 65 63 74 69 6f 6e 29 2e 47 65 74 46 69 65 6c  nection).GetFiel
1d30: 64 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d(..            
1d40: 20 20 22 5f 73 74 6f 72 65 43 6f 6e 6e 65 63 74    "_storeConnect
1d50: 69 6f 6e 22 2c 20 42 69 6e 64 69 6e 67 46 6c 61  ion", BindingFla
1d60: 67 73 2e 49 6e 73 74 61 6e 63 65 20 7c 0d 0a 20  gs.Instance |.. 
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 42 69 6e               Bin
1d80: 64 69 6e 67 46 6c 61 67 73 2e 4e 6f 6e 50 75 62  dingFlags.NonPub
1d90: 6c 69 63 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  lic);....       
1da0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
1db0: 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68 65   // NOTE: If the
1dc0: 20 66 69 65 6c 64 20 69 73 20 6e 6f 74 20 66 6f   field is not fo
1dd0: 75 6e 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e  und, just return
1de0: 20 6e 75 6c 6c 2e 0d 0a 20 20 20 20 20 20 20 20   null...        
1df0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1e00: 69 66 20 28 66 69 65 6c 64 49 6e 66 6f 20 3d 3d  if (fieldInfo ==
1e10: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1e20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
1e30: 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  l;....          
1e40: 72 65 74 75 72 6e 20 66 69 65 6c 64 49 6e 66 6f  return fieldInfo
1e50: 2e 47 65 74 56 61 6c 75 65 28 65 6e 74 69 74 79  .GetValue(entity
1e60: 43 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 73 20 44  Connection) as D
1e70: 62 43 6f 6e 6e 65 63 74 69 6f 6e 3b 0d 0a 20 20  bConnection;..  
1e80: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f      }....      /
1e90: 2f 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45  /..      // NOTE
1ea0: 3a 20 55 73 65 64 20 74 6f 20 76 65 72 69 66 79  : Used to verify
1eb0: 20 74 68 61 74 20 74 68 65 20 53 55 42 53 54 52   that the SUBSTR
1ec0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1ed0: 64 20 74 6f 0d 0a 20 20 20 20 20 20 2f 2f 20 20  d to..      //  
1ee0: 20 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 20 74       implement t
1ef0: 68 65 20 53 75 62 73 74 72 69 6e 67 20 6d 65 74  he Substring met
1f00: 68 6f 64 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a  hod...      //..
1f10: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
1f20: 61 74 69 63 20 69 6e 74 20 53 75 62 53 74 72 69  atic int SubStri
1f30: 6e 67 54 65 73 74 28 29 0d 0a 20 20 20 20 20 20  ngTest()..      
1f40: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 75 73 69  {..          usi
1f50: 6e 67 20 28 6e 6f 72 74 68 77 69 6e 64 45 46 45  ng (northwindEFE
1f60: 6e 74 69 74 69 65 73 20 64 62 20 3d 20 6e 65 77  ntities db = new
1f70: 20 6e 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69   northwindEFEnti
1f80: 74 69 65 73 28 29 29 0d 0a 20 20 20 20 20 20 20  ties())..       
1f90: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1fa0: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
1fb0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
1fd0: 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65 3b 0d 0a   once = false;..
1fe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ff0: 20 20 20 20 76 61 72 20 71 75 65 72 79 20 3d 20      var query = 
2000: 64 62 2e 43 75 73 74 6f 6d 65 72 73 2e 53 65 6c  db.Customers.Sel
2010: 65 63 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ect(..          
2020: 20 20 20 20 20 20 20 20 20 20 20 20 70 20 3d 3e              p =>
2030: 20 22 74 65 73 74 22 2e 53 75 62 73 74 72 69 6e   "test".Substrin
2040: 67 28 31 29 20 21 3d 20 6e 75 6c 6c 29 3b 0d 0a  g(1) != null);..
2050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2060: 20 20 20 20 66 6f 72 65 61 63 68 20 28 76 61 72      foreach (var
2070: 20 72 65 73 75 6c 74 20 69 6e 20 71 75 65 72 79   result in query
2080: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2090: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20b0: 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20 20   (once)..       
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
20e0: 28 27 20 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  (' ');....      
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 72 65  Console.Write(re
2110: 73 75 6c 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sult);....      
2120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2130: 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20  once = true;..  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2160: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
2170: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2180: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
2190: 20 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f   catch (Exceptio
21a0: 6e 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  n e)..          
21b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
21c0: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
21d0: 2e 57 72 69 74 65 4c 69 6e 65 28 65 29 3b 0d 0a  .WriteLine(e);..
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
21f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
2200: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2210: 20 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   1;..      }....
2220: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2230: 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20 74 6f  // NOTE: Used to
2240: 20 74 65 73 74 20 74 68 65 20 66 69 78 20 66 6f   test the fix fo
2250: 72 20 74 69 63 6b 65 74 20 5b 38 62 37 64 31 37  r ticket [8b7d17
2260: 39 63 33 63 5d 2e 0d 0a 20 20 20 20 20 20 2f 2f  9c3c]...      //
2270: 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74 65 20  ..      private 
2280: 73 74 61 74 69 63 20 69 6e 74 20 53 6b 69 70 54  static int SkipT
2290: 65 73 74 28 69 6e 74 20 70 61 67 65 53 69 7a 65  est(int pageSize
22a0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
22b0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72        using (nor
22c0: 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73  thwindEFEntities
22d0: 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77   db = new northw
22e0: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29  indEFEntities())
22f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
2310: 6c 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65 3b 0d  l once = false;.
2320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2330: 6e 74 20 63 6f 75 6e 74 20 3d 20 64 62 2e 43 75  nt count = db.Cu
2340: 73 74 6f 6d 65 72 73 2e 43 6f 75 6e 74 28 29 3b  stomers.Count();
2350: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2360: 20 20 69 6e 74 20 50 61 67 65 43 6f 75 6e 74 20    int PageCount 
2370: 3d 20 28 70 61 67 65 53 69 7a 65 20 21 3d 20 30  = (pageSize != 0
2380: 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) ?..           
2390: 20 20 20 20 20 20 20 28 63 6f 75 6e 74 20 2f 20         (count / 
23a0: 70 61 67 65 53 69 7a 65 29 20 2b 20 28 28 63 6f  pageSize) + ((co
23b0: 75 6e 74 20 25 20 70 61 67 65 53 69 7a 65 29 20  unt % pageSize) 
23c0: 3d 3d 20 30 20 3f 20 30 20 3a 20 31 29 20 3a 20  == 0 ? 0 : 1) : 
23d0: 31 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  1;....          
23e0: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 70 61 67      for (int pag
23f0: 65 49 6e 64 65 78 20 3d 20 30 3b 20 70 61 67 65  eIndex = 0; page
2400: 49 6e 64 65 78 20 3c 20 50 61 67 65 43 6f 75 6e  Index < PageCoun
2410: 74 3b 20 70 61 67 65 49 6e 64 65 78 2b 2b 29 0d  t; pageIndex++).
2420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
2430: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2440: 20 20 20 20 76 61 72 20 71 75 65 72 79 20 3d 20      var query = 
2450: 64 62 2e 43 75 73 74 6f 6d 65 72 73 2e 4f 72 64  db.Customers.Ord
2460: 65 72 42 79 28 70 20 3d 3e 20 70 2e 43 69 74 79  erBy(p => p.City
2470: 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )...            
2480: 20 20 20 20 20 20 20 20 20 20 53 6b 69 70 28 70            Skip(p
2490: 61 67 65 53 69 7a 65 20 2a 20 70 61 67 65 49 6e  ageSize * pageIn
24a0: 64 65 78 29 2e 54 61 6b 65 28 70 61 67 65 53 69  dex).Take(pageSi
24b0: 7a 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ze);....        
24c0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
24d0: 68 20 28 43 75 73 74 6f 6d 65 72 73 20 63 75 73  h (Customers cus
24e0: 74 6f 6d 65 72 73 20 69 6e 20 71 75 65 72 79 29  tomers in query)
24f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2500: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
2520: 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20 20 20  (once)..        
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28    Console.Write(
2550: 27 20 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ' ');....       
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
2570: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 63 75 73  onsole.Write(cus
2580: 74 6f 6d 65 72 73 2e 43 75 73 74 6f 6d 65 72 49  tomers.CustomerI
2590: 44 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  D);....         
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 63               onc
25b0: 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  e = true;..     
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
25e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
25f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2600: 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a   0;..      }....
2610: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2620: 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20 74 6f  // NOTE: Used to
2630: 20 74 65 73 74 20 74 68 65 20 66 69 78 20 66 6f   test the fix fo
2640: 72 20 74 69 63 6b 65 74 20 5b 35 39 65 64 63 31  r ticket [59edc1
2650: 30 31 38 62 5d 2e 0d 0a 20 20 20 20 20 20 2f 2f  018b]...      //
2660: 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74 65 20  ..      private 
2670: 73 74 61 74 69 63 20 69 6e 74 20 45 6e 64 73 57  static int EndsW
2680: 69 74 68 54 65 73 74 28 73 74 72 69 6e 67 20 76  ithTest(string v
2690: 61 6c 75 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  alue)..      {..
26a0: 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
26b0: 28 6e 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69  (northwindEFEnti
26c0: 74 69 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f  ties db = new no
26d0: 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65  rthwindEFEntitie
26e0: 73 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  s())..          
26f0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2700: 20 62 6f 6f 6c 20 6f 6e 63 65 20 3d 20 66 61 6c   bool once = fal
2710: 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
2720: 20 20 20 76 61 72 20 71 75 65 72 79 20 3d 20 66     var query = f
2730: 72 6f 6d 20 63 20 69 6e 20 64 62 2e 43 75 73 74  rom c in db.Cust
2740: 6f 6d 65 72 73 0d 0a 20 20 20 20 20 20 20 20 20  omers..         
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 77 68 65 72 65 20 63 2e 43 69 74 79 2e 45 6e   where c.City.En
2770: 64 73 57 69 74 68 28 76 61 6c 75 65 29 0d 0a 20  dsWith(value).. 
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2790: 20 20 20 20 20 20 20 20 20 6f 72 64 65 72 62 79           orderby
27a0: 20 63 2e 43 75 73 74 6f 6d 65 72 49 44 0d 0a 20   c.CustomerID.. 
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 20           select 
27d0: 63 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  c;....          
27e0: 20 20 20 20 66 6f 72 65 61 63 68 20 28 43 75 73      foreach (Cus
27f0: 74 6f 6d 65 72 73 20 63 75 73 74 6f 6d 65 72 73  tomers customers
2800: 20 69 6e 20 71 75 65 72 79 29 0d 0a 20 20 20 20   in query)..    
2810: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2830: 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20  f (once)..      
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27 20  Console.Write(' 
2860: 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ');....         
2870: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
2880: 2e 57 72 69 74 65 28 63 75 73 74 6f 6d 65 72 73  .Write(customers
2890: 2e 43 75 73 74 6f 6d 65 72 49 44 29 3b 0d 0a 0d  .CustomerID);...
28a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b0: 20 20 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d     once = true;.
28c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
28d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d  ..          }...
28e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
28f0: 6e 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  n 0;..      }...
2900: 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20  .      //..     
2910: 20 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20 74   // NOTE: Used t
2920: 6f 20 76 65 72 69 66 79 20 74 68 65 20 62 65 68  o verify the beh
2930: 61 76 69 6f 72 20 66 72 6f 6d 20 74 69 63 6b 65  avior from ticke
2940: 74 20 5b 30 30 66 38 36 66 39 37 33 39 5d 2e 0d  t [00f86f9739]..
2950: 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20  .      //..     
2960: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
2970: 69 6e 74 20 53 74 61 72 74 73 57 69 74 68 54 65  int StartsWithTe
2980: 73 74 28 73 74 72 69 6e 67 20 76 61 6c 75 65 29  st(string value)
2990: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
29a0: 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72 74       using (nort
29b0: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 20  hwindEFEntities 
29c0: 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69  db = new northwi
29d0: 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29 0d  ndEFEntities()).
29e0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
2a00: 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65 3b 0d 0a   once = false;..
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
2a20: 72 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 63  r query = from c
2a30: 20 69 6e 20 64 62 2e 43 75 73 74 6f 6d 65 72 73   in db.Customers
2a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
2a60: 65 20 63 2e 43 69 74 79 2e 53 74 61 72 74 73 57  e c.City.StartsW
2a70: 69 74 68 28 76 61 6c 75 65 29 0d 0a 20 20 20 20  ith(value)..    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 6f 72 64 65 72 62 79 20 63 2e        orderby c.
2aa0: 43 75 73 74 6f 6d 65 72 49 44 0d 0a 20 20 20 20  CustomerID..    
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 73 65 6c 65 63 74 20 63 3b 0d        select c;.
2ad0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2ae0: 20 66 6f 72 65 61 63 68 20 28 43 75 73 74 6f 6d   foreach (Custom
2af0: 65 72 73 20 63 75 73 74 6f 6d 65 72 73 20 69 6e  ers customers in
2b00: 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20   query)..       
2b10: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
2b30: 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20 20 20 20  once)..         
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e               Con
2b50: 73 6f 6c 65 2e 57 72 69 74 65 28 27 20 27 29 3b  sole.Write(' ');
2b60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2b70: 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72        Console.Wr
2b80: 69 74 65 28 63 75 73 74 6f 6d 65 72 73 2e 43 75  ite(customers.Cu
2b90: 73 74 6f 6d 65 72 49 44 29 3b 0d 0a 0d 0a 20 20  stomerID);....  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20  once = true;..  
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
2bd0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2be0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
2bf0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 23 69  ;..      }....#i
2c00: 66 20 55 53 45 5f 49 4e 54 45 52 4f 50 5f 44 4c  f USE_INTEROP_DL
2c10: 4c 20 26 26 20 49 4e 54 45 52 4f 50 5f 45 58 54  L && INTEROP_EXT
2c20: 45 4e 53 49 4f 4e 5f 46 55 4e 43 54 49 4f 4e 53  ENSION_FUNCTIONS
2c30: 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20  ..      //..    
2c40: 20 20 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20    // NOTE: Used 
2c50: 74 6f 20 74 65 73 74 20 74 68 65 20 66 69 78 20  to test the fix 
2c60: 66 6f 72 20 74 69 63 6b 65 74 20 5b 30 61 33 32  for ticket [0a32
2c70: 38 38 35 31 30 39 5d 2e 0d 0a 20 20 20 20 20 20  885109]...      
2c80: 2f 2f 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74  //..      privat
2c90: 65 20 73 74 61 74 69 63 20 69 6e 74 20 55 6e 69  e static int Uni
2ca0: 6f 6e 41 6c 6c 54 65 73 74 28 29 0d 0a 20 20 20  onAllTest()..   
2cb0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2cc0: 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69 6e 64  using (northwind
2cd0: 45 46 45 6e 74 69 74 69 65 73 20 64 62 20 3d 20  EFEntities db = 
2ce0: 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45 46 45  new northwindEFE
2cf0: 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20 20 20  ntities())..    
2d00: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2d10: 20 20 20 20 20 20 20 62 6f 6f 6c 20 6f 6e 63 65         bool once
2d20: 20 3d 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20   = false;....   
2d30: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20 63             var c
2d40: 75 73 74 6f 6d 65 72 73 31 20 3d 20 64 62 2e 43  ustomers1 = db.C
2d50: 75 73 74 6f 6d 65 72 73 2e 57 68 65 72 65 28 0d  ustomers.Where(.
2d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d70: 20 20 20 66 20 3d 3e 20 66 2e 4f 72 64 65 72 73     f => f.Orders
2d80: 2e 41 6e 79 28 29 29 2e 4f 72 64 65 72 42 79 44  .Any()).OrderByD
2d90: 65 73 63 65 6e 64 69 6e 67 28 0d 0a 20 20 20 20  escending(..    
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db0: 66 20 3d 3e 20 66 2e 43 6f 6d 70 61 6e 79 4e 61  f => f.CompanyNa
2dc0: 6d 65 29 2e 53 6b 69 70 28 31 29 2e 54 61 6b 65  me).Skip(1).Take
2dd0: 28 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  (1);....        
2de0: 20 20 20 20 20 20 76 61 72 20 63 75 73 74 6f 6d        var custom
2df0: 65 72 73 32 20 3d 20 64 62 2e 43 75 73 74 6f 6d  ers2 = db.Custom
2e00: 65 72 73 2e 57 68 65 72 65 28 0d 0a 20 20 20 20  ers.Where(..    
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 20                f 
2e20: 3d 3e 20 66 2e 4f 72 64 65 72 73 2e 41 6e 79 28  => f.Orders.Any(
2e30: 29 29 2e 4f 72 64 65 72 42 79 28 0d 0a 20 20 20  )).OrderBy(..   
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 66 20 3d 3e 20 66 2e 43 6f 6d 70 61 6e 79 4e   f => f.CompanyN
2e60: 61 6d 65 29 2e 53 6b 69 70 28 31 29 2e 54 61 6b  ame).Skip(1).Tak
2e70: 65 28 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  e(1);....       
2e80: 20 20 20 20 20 20 20 76 61 72 20 63 75 73 74 6f         var custo
2e90: 6d 65 72 73 33 20 3d 20 64 62 2e 43 75 73 74 6f  mers3 = db.Custo
2ea0: 6d 65 72 73 2e 57 68 65 72 65 28 0d 0a 20 20 20  mers.Where(..   
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
2ec0: 20 3d 3e 20 66 2e 43 75 73 74 6f 6d 65 72 49 44   => f.CustomerID
2ed0: 2e 53 74 61 72 74 73 57 69 74 68 28 22 42 22 29  .StartsWith("B")
2ee0: 29 2e 4f 72 64 65 72 42 79 28 0d 0a 20 20 20 20  ).OrderBy(..    
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 66 20 3d 3e 20 66 2e 43 6f 6d 70 61 6e 79 4e 61  f => f.CompanyNa
2f10: 6d 65 29 2e 53 6b 69 70 28 31 29 2e 54 61 6b 65  me).Skip(1).Take
2f20: 28 31 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  (1);....        
2f30: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 76        foreach (v
2f40: 61 72 20 63 75 73 74 6f 6d 65 72 20 69 6e 20 63  ar customer in c
2f50: 75 73 74 6f 6d 65 72 73 31 29 0d 0a 20 20 20 20  ustomers1)..    
2f60: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2f80: 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20  f (once)..      
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27 20  Console.Write(' 
2fb0: 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ');....         
2fc0: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
2fd0: 2e 57 72 69 74 65 28 63 75 73 74 6f 6d 65 72 2e  .Write(customer.
2fe0: 43 75 73 74 6f 6d 65 72 49 44 29 3b 0d 0a 20 20  CustomerID);..  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20  once = true;..  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
3020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
3030: 6f 72 65 61 63 68 20 28 76 61 72 20 63 75 73 74  oreach (var cust
3040: 6f 6d 65 72 20 69 6e 20 63 75 73 74 6f 6d 65 72  omer in customer
3050: 73 32 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  s2)..           
3060: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
3070: 20 20 20 20 20 20 20 20 69 66 20 28 6f 6e 63 65          if (once
3080: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
3090: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
30a0: 2e 57 72 69 74 65 28 27 20 27 29 3b 0d 0a 0d 0a  .Write(' ');....
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28    Console.Write(
30d0: 63 75 73 74 6f 6d 65 72 2e 43 75 73 74 6f 6d 65  customer.Custome
30e0: 72 49 44 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  rID);..         
30f0: 20 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20           once = 
3100: 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  true;..         
3110: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
3120: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
3130: 28 76 61 72 20 63 75 73 74 6f 6d 65 72 20 69 6e  (var customer in
3140: 20 63 75 73 74 6f 6d 65 72 73 33 29 0d 0a 20 20   customers3)..  
3150: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 69 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20   if (once)..    
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28    Console.Write(
31a0: 27 20 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ' ');....       
31b0: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f             Conso
31c0: 6c 65 2e 57 72 69 74 65 28 63 75 73 74 6f 6d 65  le.Write(custome
31d0: 72 2e 43 75 73 74 6f 6d 65 72 49 44 29 3b 0d 0a  r.CustomerID);..
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 20 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a    once = true;..
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
3210: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3220: 20 66 6f 72 65 61 63 68 20 28 76 61 72 20 63 75   foreach (var cu
3230: 73 74 6f 6d 65 72 20 69 6e 20 63 75 73 74 6f 6d  stomer in custom
3240: 65 72 73 31 2e 43 6f 6e 63 61 74 28 63 75 73 74  ers1.Concat(cust
3250: 6f 6d 65 72 73 32 29 29 0d 0a 20 20 20 20 20 20  omers2))..      
3260: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
3280: 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20 20 20  (once)..        
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
32a0: 6e 73 6f 6c 65 2e 57 72 69 74 65 28 27 20 27 29  nsole.Write(' ')
32b0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
32c0: 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57         Console.W
32d0: 72 69 74 65 28 63 75 73 74 6f 6d 65 72 2e 43 75  rite(customer.Cu
32e0: 73 74 6f 6d 65 72 49 44 29 3b 0d 0a 20 20 20 20  stomerID);..    
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
3300: 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ce = true;..    
3310: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
3330: 65 61 63 68 20 28 76 61 72 20 63 75 73 74 6f 6d  each (var custom
3340: 65 72 20 69 6e 0d 0a 20 20 20 20 20 20 20 20 20  er in..         
3350: 20 20 20 20 20 20 20 20 20 20 20 63 75 73 74 6f             custo
3360: 6d 65 72 73 31 2e 43 6f 6e 63 61 74 28 63 75 73  mers1.Concat(cus
3370: 74 6f 6d 65 72 73 32 29 2e 43 6f 6e 63 61 74 28  tomers2).Concat(
3380: 63 75 73 74 6f 6d 65 72 73 33 29 29 0d 0a 20 20  customers3))..  
3390: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 69 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20   if (once)..    
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28    Console.Write(
33e0: 27 20 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ' ');....       
33f0: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f             Conso
3400: 6c 65 2e 57 72 69 74 65 28 63 75 73 74 6f 6d 65  le.Write(custome
3410: 72 2e 43 75 73 74 6f 6d 65 72 49 44 29 3b 0d 0a  r.CustomerID);..
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a    once = true;..
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
3450: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
3460: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3470: 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65   0;..      }..#e
3480: 6e 64 69 66 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f  ndif....      //
3490: 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a  ..      // NOTE:
34a0: 20 55 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   Used to test th
34b0: 65 20 66 69 78 20 66 6f 72 20 74 69 63 6b 65 74  e fix for ticket
34c0: 20 5b 63 63 66 61 36 39 66 63 33 32 5d 2e 0d 0a   [ccfa69fc32]...
34d0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
34e0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69  private static i
34f0: 6e 74 20 45 46 54 72 61 6e 73 61 63 74 69 6f 6e  nt EFTransaction
3500: 54 65 73 74 28 62 6f 6f 6c 20 61 64 64 29 0d 0a  Test(bool add)..
3510: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3520: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
3530: 20 2f 2f 20 4e 4f 54 45 3a 20 53 6f 6d 65 20 6f   // NOTE: Some o
3540: 66 20 74 68 65 73 65 20 74 65 72 72 69 74 6f 72  f these territor
3550: 69 65 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  ies already exis
3560: 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 63 61 75  t and should cau
3570: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f  se..          //
3580: 20 20 20 20 20 20 20 61 6e 20 65 78 63 65 70 74         an except
3590: 69 6f 6e 20 74 6f 20 62 65 20 74 68 72 6f 77 6e  ion to be thrown
35a0: 20 77 68 65 6e 20 77 65 20 74 72 79 20 74 6f 20   when we try to 
35b0: 49 4e 53 45 52 54 20 74 68 65 6d 2e 0d 0a 20 20  INSERT them...  
35c0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
35d0: 20 20 20 20 20 20 6c 6f 6e 67 5b 5d 20 74 65 72        long[] ter
35e0: 72 69 74 6f 72 79 49 64 73 20 3d 20 6e 65 77 20  ritoryIds = new 
35f0: 6c 6f 6e 67 5b 5d 20 7b 0d 0a 20 20 20 20 20 20  long[] {..      
3600: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 20 20             1,   
3610: 20 32 2c 20 20 20 20 33 2c 20 20 20 20 34 2c 20   2,    3,    4, 
3620: 20 20 20 35 2c 20 2f 2f 20 4e 4f 54 45 3a 20 53     5, // NOTE: S
3630: 75 63 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20  uccess..        
3640: 20 20 20 20 20 20 20 20 20 36 2c 20 20 20 20 37           6,    7
3650: 2c 20 20 20 20 38 2c 20 20 20 20 39 2c 20 20 20  ,    8,    9,   
3660: 31 30 2c 20 2f 2f 20 4e 4f 54 45 3a 20 53 75 63  10, // NOTE: Suc
3670: 63 65 73 73 0d 0a 20 20 20 20 20 20 20 20 20 20  cess..          
3680: 20 20 20 20 31 35 37 36 2c 20 31 35 37 37 2c 20      1576, 1577, 
3690: 31 35 37 38 2c 20 31 35 37 39 2c 20 31 35 38 30  1578, 1579, 1580
36a0: 2c 20 2f 2f 20 4e 4f 54 45 3a 20 53 75 63 63 65  , // NOTE: Succe
36b0: 73 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss..            
36c0: 20 20 31 35 38 31 2c 20 31 37 33 30 2c 20 31 38    1581, 1730, 18
36d0: 33 33 2c 20 32 31 31 36 2c 20 32 31 33 39 2c 20  33, 2116, 2139, 
36e0: 2f 2f 20 4e 4f 54 45 3a 20 46 61 69 6c 20 28 31  // NOTE: Fail (1
36f0: 35 38 31 29 0d 0a 20 20 20 20 20 20 20 20 20 20  581)..          
3700: 20 20 20 20 32 31 34 30 2c 20 32 31 34 31 20 20      2140, 2141  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 2f 2f 20 4e 4f 54 45 3a 20 53 6b 69 70 70    // NOTE: Skipp
3730: 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  ed..          };
3740: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66  ....          if
3750: 20 28 61 64 64 29 0d 0a 20 20 20 20 20 20 20 20   (add)..        
3760: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
3770: 20 20 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77     using (northw
3780: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 20 64 62  indEFEntities db
3790: 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64   = new northwind
37a0: 45 46 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20  EFEntities()).. 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 75 73 69 6e 67 20 28 54 72 61 6e 73 61 63    using (Transac
37e0: 74 69 6f 6e 53 63 6f 70 65 20 73 63 6f 70 65 20  tionScope scope 
37f0: 3d 20 6e 65 77 20 54 72 61 6e 73 61 63 74 69 6f  = new Transactio
3800: 6e 53 63 6f 70 65 28 29 29 0d 0a 20 20 20 20 20  nScope())..     
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2f 20 4e 4f 54 45 3a 20 2a 52 45 51 55 49 52  // NOTE: *REQUIR
3860: 45 44 2a 20 54 68 69 73 20 69 73 20 72 65 71 75  ED* This is requ
3870: 69 72 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ired so that the
3880: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3890: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
38a0: 20 45 6e 74 69 74 79 20 46 72 61 6d 65 77 6f 72   Entity Framewor
38b0: 6b 20 69 73 20 70 72 65 76 65 6e 74 65 64 20 66  k is prevented f
38c0: 72 6f 6d 20 6f 70 65 6e 69 6e 67 0d 0a 20 20 20  rom opening..   
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 2f 2f 20 20 20 20 20 20 20 6d 75 6c 74     //       mult
38f0: 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  iple connections
3900: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
3910: 6e 67 20 53 51 4c 69 74 65 0d 0a 20 20 20 20 20  ng SQLite..     
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 2f 2f 20 20 20 20 20 20 20 64 61 74 61 62 61   //       databa
3940: 73 65 20 28 69 2e 65 2e 20 77 68 69 63 68 20 77  se (i.e. which w
3950: 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 6d  ould result in m
3960: 75 6c 74 69 70 6c 65 0d 0a 20 20 20 20 20 20 20  ultiple..       
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3980: 2f 20 20 20 20 20 20 20 49 4d 4d 45 44 49 41 54  /       IMMEDIAT
3990: 45 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20  E transactions, 
39a0: 74 68 65 72 65 62 79 20 66 61 69 6c 69 6e 67 20  thereby failing 
39b0: 5b 6c 61 74 65 72 0d 0a 20 20 20 20 20 20 20 20  [later..        
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
39d0: 20 20 20 20 20 20 20 6f 6e 5d 20 77 69 74 68 20         on] with 
39e0: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 73 29 2e  locking errors).
39f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3a00: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 64 62 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e    db.Connection.
3a30: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 66 6f 72 65 61 63 68 20 28 69 6e 74 20 69 64   foreach (int id
3a60: 20 69 6e 20 74 65 72 72 69 74 6f 72 79 49 64 73   in territoryIds
3a70: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
3a80: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 20 54 65 72 72 69 74 6f 72 69 65        Territorie
3ab0: 73 20 74 65 72 72 69 74 6f 72 69 65 73 20 3d 20  s territories = 
3ac0: 6e 65 77 20 54 65 72 72 69 74 6f 72 69 65 73 28  new Territories(
3ad0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3af0: 74 65 72 72 69 74 6f 72 69 65 73 2e 54 65 72 72  territories.Terr
3b00: 69 74 6f 72 79 49 44 20 3d 20 69 64 3b 0d 0a 20  itoryID = id;.. 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 20 20 20 20 20 74 65 72 72 69 74 6f           territo
3b30: 72 69 65 73 2e 54 65 72 72 69 74 6f 72 79 44 65  ries.TerritoryDe
3b40: 73 63 72 69 70 74 69 6f 6e 20 3d 20 53 74 72 69  scription = Stri
3b50: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 22 54 65 73 74 20            "Test 
3b80: 54 65 72 72 69 74 6f 72 79 20 23 7b 30 7d 22 2c  Territory #{0}",
3b90: 20 69 64 29 3b 0d 0a 20 20 20 20 20 20 20 20 20   id);..         
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 74 65 72 72 69 74 6f 72 69 65 73 2e 52 65 67   territories.Reg
3bc0: 69 6f 6e 73 20 3d 20 64 62 2e 52 65 67 69 6f 6e  ions = db.Region
3bd0: 73 2e 46 69 72 73 74 28 29 3b 0d 0a 0d 0a 20 20  s.First();....  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bf0: 20 20 20 20 20 20 20 20 64 62 2e 41 64 64 4f 62          db.AddOb
3c00: 6a 65 63 74 28 22 54 65 72 72 69 74 6f 72 69 65  ject("Territorie
3c10: 73 22 2c 20 74 65 72 72 69 74 6f 72 69 65 73 29  s", territories)
3c20: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
3c30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20      try..       
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3c70: 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c 20  ..#if NET_40 || 
3c80: 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34 35  NET_45 || NET_45
3c90: 31 20 7c 7c 20 4e 45 54 5f 34 36 0d 0a 20 20 20  1 || NET_46..   
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cb0: 20 20 20 20 20 20 20 64 62 2e 53 61 76 65 43 68         db.SaveCh
3cc0: 61 6e 67 65 73 28 53 61 76 65 4f 70 74 69 6f 6e  anges(SaveOption
3cd0: 73 2e 4e 6f 6e 65 29 3b 0d 0a 23 65 6c 73 65 0d  s.None);..#else.
3ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3cf0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2e 53 61             db.Sa
3d00: 76 65 43 68 61 6e 67 65 73 28 66 61 6c 73 65 29  veChanges(false)
3d10: 3b 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20  ;..#endif..     
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
3d40: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20            catch 
3d50: 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20  (Exception e).. 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c    Console.WriteL
3da0: 69 6e 65 28 65 29 3b 0d 0a 20 20 20 20 20 20 20  ine(e);..       
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3dd0: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d          finally.
3de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3df0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 73 63 6f 70 65 2e 43 6f 6d 70 6c 65      scope.Comple
3e20: 74 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  te();..         
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e40: 20 64 62 2e 41 63 63 65 70 74 41 6c 6c 43 68 61   db.AcceptAllCha
3e50: 6e 67 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20  nges();..       
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3e70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3e80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3e90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
3ea0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65    }..          e
3eb0: 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  lse..          {
3ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ed0: 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69 6e 64  using (northwind
3ee0: 45 46 45 6e 74 69 74 69 65 73 20 64 62 20 3d 20  EFEntities db = 
3ef0: 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45 46 45  new northwindEFE
3f00: 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20 20 20  ntities())..    
3f10: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
3f30: 6f 6f 6c 20 6f 6e 63 65 20 3d 20 66 61 6c 73 65  ool once = false
3f40: 3b 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c 7c  ;..#if NET_40 ||
3f50: 20 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f 34   NET_45 || NET_4
3f60: 35 31 20 7c 7c 20 4e 45 54 5f 34 36 0d 0a 20 20  51 || NET_46..  
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 76 61 72 20 71 75 65 72 79 20 3d 20 66 72 6f 6d  var query = from
3f90: 20 74 20 69 6e 20 64 62 2e 54 65 72 72 69 74 6f   t in db.Territo
3fa0: 72 69 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20  ries..          
3fb0: 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 20            where 
3fc0: 74 65 72 72 69 74 6f 72 79 49 64 73 2e 41 73 51  territoryIds.AsQ
3fd0: 75 65 72 79 61 62 6c 65 3c 6c 6f 6e 67 3e 28 29  ueryable<long>()
3fe0: 2e 43 6f 6e 74 61 69 6e 73 3c 6c 6f 6e 67 3e 28  .Contains<long>(
3ff0: 74 2e 54 65 72 72 69 74 6f 72 79 49 44 29 0d 0a  t.TerritoryID)..
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 20 20 6f 72 64 65 72 62 79 20 74 2e 54 65      orderby t.Te
4020: 72 72 69 74 6f 72 79 49 44 0d 0a 20 20 20 20 20  rritoryID..     
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4040: 65 6c 65 63 74 20 74 3b 0d 0a 0d 0a 20 20 20 20  elect t;....    
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
4060: 72 65 61 63 68 20 28 54 65 72 72 69 74 6f 72 69  reach (Territori
4070: 65 73 20 74 65 72 72 69 74 6f 72 69 65 73 20 69  es territories i
4080: 6e 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20  n query)..      
4090: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 20 20 20 20 69 66 20 28 6f 6e 63 65 29 0d 0a       if (once)..
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
40e0: 65 2e 57 72 69 74 65 28 27 20 27 29 3b 0d 0a 0d  e.Write(' ');...
40f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4100: 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57         Console.W
4110: 72 69 74 65 28 74 65 72 72 69 74 6f 72 69 65 73  rite(territories
4120: 2e 54 65 72 72 69 74 6f 72 79 49 44 29 3b 0d 0a  .TerritoryID);..
4130: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4140: 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 74          once = t
4150: 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
4160: 20 20 20 20 20 20 20 20 7d 0d 0a 23 65 6c 73 65          }..#else
4170: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4180: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
4190: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 48 41 43            // HAC
41a0: 4b 3a 20 57 65 20 63 61 6e 6e 6f 74 20 75 73 65  K: We cannot use
41b0: 20 74 68 65 20 43 6f 6e 74 61 69 6e 73 20 65 78   the Contains ex
41c0: 74 65 6e 73 69 6f 6e 20 6d 65 74 68 6f 64 20 77  tension method w
41d0: 69 74 68 69 6e 20 61 0d 0a 20 20 20 20 20 20 20  ithin a..       
41e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
41f0: 20 20 20 20 4c 49 4e 51 20 71 75 65 72 79 20 77      LINQ query w
4200: 69 74 68 20 74 68 65 20 2e 4e 45 54 20 46 72 61  ith the .NET Fra
4210: 6d 65 77 6f 72 6b 20 33 2e 35 2e 0d 0a 20 20 20  mework 3.5...   
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4230: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
4240: 20 20 20 20 20 76 61 72 20 71 75 65 72 79 20 3d       var query =
4250: 20 66 72 6f 6d 20 74 20 69 6e 20 64 62 2e 54 65   from t in db.Te
4260: 72 72 69 74 6f 72 69 65 73 0d 0a 20 20 20 20 20  rritories..     
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
4280: 72 64 65 72 62 79 20 74 2e 54 65 72 72 69 74 6f  rderby t.Territo
4290: 72 79 49 44 0d 0a 20 20 20 20 20 20 20 20 20 20  ryID..          
42a0: 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
42b0: 20 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20   t;....         
42c0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
42d0: 20 28 54 65 72 72 69 74 6f 72 69 65 73 20 74 65   (Territories te
42e0: 72 72 69 74 6f 72 69 65 73 20 69 6e 20 71 75 65  rritories in que
42f0: 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry)..           
4300: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 69 66 20 28 41 72 72 61 79 2e 49 6e 64 65 78 4f  if (Array.IndexO
4330: 66 28 74 65 72 72 69 74 6f 72 79 49 64 73 2c 20  f(territoryIds, 
4340: 74 65 72 72 69 74 6f 72 69 65 73 2e 54 65 72 72  territories.Terr
4350: 69 74 6f 72 79 49 44 29 20 3d 3d 20 2d 31 29 0d  itoryID) == -1).
4360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4370: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
4380: 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nue;....        
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
43a0: 20 28 6f 6e 63 65 29 0d 0a 20 20 20 20 20 20 20   (once)..       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
43d0: 28 27 20 27 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  (' ');....      
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 74 65  Console.Write(te
4400: 72 72 69 74 6f 72 69 65 73 2e 54 65 72 72 69 74  rritories.Territ
4410: 6f 72 79 49 44 29 3b 0d 0a 0d 0a 20 20 20 20 20  oryID);....     
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20   once = true;.. 
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20   }..#endif..    
4460: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
4470: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
4480: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d        return 0;.
4490: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 23 69 66 20  .      }....#if 
44a0: 4e 45 54 5f 34 30 20 7c 7c 20 4e 45 54 5f 34 35  NET_40 || NET_45
44b0: 20 7c 7c 20 4e 45 54 5f 34 35 31 20 7c 7c 20 4e   || NET_451 || N
44c0: 45 54 5f 34 36 0d 0a 20 20 20 20 20 20 2f 2f 0d  ET_46..      //.
44d0: 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20  .      // NOTE: 
44e0: 55 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  Used to test the
44f0: 20 49 4e 53 45 52 54 20 66 69 78 20 28 69 2e 65   INSERT fix (i.e
4500: 2e 20 61 6e 20 65 78 74 72 61 20 73 65 6d 69 2d  . an extra semi-
4510: 63 6f 6c 6f 6e 20 69 6e 0d 0a 20 20 20 20 20 20  colon in..      
4520: 2f 2f 20 20 20 20 20 20 20 74 68 65 20 53 51 4c  //       the SQL
4530: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
4540: 20 74 68 65 20 61 63 74 75 61 6c 20 49 4e 53 45   the actual INSE
4550: 52 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 0d  RT statement in.
4560: 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20  .      //       
4570: 74 68 65 20 66 6f 6c 6c 6f 77 2d 75 70 20 53 45  the follow-up SE
4580: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 2e  LECT statement).
4590: 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20  ..      //..    
45a0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
45b0: 20 69 6e 74 20 49 6e 73 65 72 74 54 65 73 74 28   int InsertTest(
45c0: 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  )..      {..    
45d0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72        using (nor
45e0: 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73  thwindEFEntities
45f0: 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77   db = new northw
4600: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29  indEFEntities())
4610: 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20  ..          {.. 
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
4630: 5b 5d 20 63 6f 75 6e 74 73 20 3d 20 7b 20 30 20  [] counts = { 0 
4640: 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  };....          
4650: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
4660: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 2a        // NOTE: *
4670: 52 45 51 55 49 52 45 44 2a 20 54 68 69 73 20 69  REQUIRED* This i
4680: 73 20 72 65 71 75 69 72 65 64 20 73 6f 20 74 68  s required so th
4690: 61 74 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  at the..        
46a0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 45        //       E
46b0: 6e 74 69 74 79 20 46 72 61 6d 65 77 6f 72 6b 20  ntity Framework 
46c0: 69 73 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f  is prevented fro
46d0: 6d 20 6f 70 65 6e 69 6e 67 0d 0a 20 20 20 20 20  m opening..     
46e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
46f0: 20 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 6e 65    multiple conne
4700: 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 75 6e  ctions to the un
4710: 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 0d  derlying SQLite.
4720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
4730: 2f 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  /       database
4740: 20 28 69 2e 65 2e 20 77 68 69 63 68 20 77 6f 75   (i.e. which wou
4750: 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 6d 75 6c  ld result in mul
4760: 74 69 70 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  tiple..         
4770: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 49 4d       //       IM
4780: 4d 45 44 49 41 54 45 20 74 72 61 6e 73 61 63 74  MEDIATE transact
4790: 69 6f 6e 73 2c 20 74 68 65 72 65 62 79 20 66 61  ions, thereby fa
47a0: 69 6c 69 6e 67 20 5b 6c 61 74 65 72 0d 0a 20 20  iling [later..  
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
47c0: 20 20 20 20 20 6f 6e 5d 20 77 69 74 68 20 6c 6f       on] with lo
47d0: 63 6b 69 6e 67 20 65 72 72 6f 72 73 29 2e 0d 0a  cking errors)...
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
47f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4800: 64 62 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e 4f 70  db.Connection.Op
4810: 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  en();....       
4820: 20 20 20 20 20 20 20 4f 72 64 65 72 44 65 74 61         OrderDeta
4830: 69 6c 73 20 6e 65 77 4f 72 64 65 72 44 65 74 61  ils newOrderDeta
4840: 69 6c 73 20 3d 20 6e 65 77 20 4f 72 64 65 72 44  ils = new OrderD
4850: 65 74 61 69 6c 73 28 29 3b 0d 0a 0d 0a 20 20 20  etails();....   
4860: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72             newOr
4870: 64 65 72 44 65 74 61 69 6c 73 2e 4f 72 64 65 72  derDetails.Order
4880: 49 44 20 3d 20 31 30 32 34 38 3b 0d 0a 20 20 20  ID = 10248;..   
4890: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72             newOr
48a0: 64 65 72 44 65 74 61 69 6c 73 2e 50 72 6f 64 75  derDetails.Produ
48b0: 63 74 49 44 20 3d 20 31 3b 0d 0a 20 20 20 20 20  ctID = 1;..     
48c0: 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72 64 65           newOrde
48d0: 72 44 65 74 61 69 6c 73 2e 55 6e 69 74 50 72 69  rDetails.UnitPri
48e0: 63 65 20 3d 20 28 64 65 63 69 6d 61 6c 29 31 2e  ce = (decimal)1.
48f0: 32 33 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  23;..           
4900: 20 20 20 6e 65 77 4f 72 64 65 72 44 65 74 61 69     newOrderDetai
4910: 6c 73 2e 51 75 61 6e 74 69 74 79 20 3d 20 31 3b  ls.Quantity = 1;
4920: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4930: 6e 65 77 4f 72 64 65 72 44 65 74 61 69 6c 73 2e  newOrderDetails.
4940: 44 69 73 63 6f 75 6e 74 20 3d 20 30 2e 30 66 3b  Discount = 0.0f;
4950: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4960: 20 20 64 62 2e 41 64 64 4f 62 6a 65 63 74 28 22    db.AddObject("
4970: 4f 72 64 65 72 44 65 74 61 69 6c 73 22 2c 20 6e  OrderDetails", n
4980: 65 77 4f 72 64 65 72 44 65 74 61 69 6c 73 29 3b  ewOrderDetails);
4990: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
49a0: 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20    try..         
49b0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
49c0: 20 20 20 20 20 20 20 20 20 20 64 62 2e 53 61 76            db.Sav
49d0: 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a 20 20 20  eChanges();..   
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
49f0: 6f 75 6e 74 73 5b 30 5d 2b 2b 3b 0d 0a 20 20 20  ounts[0]++;..   
4a00: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74 63              catc
4a20: 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29 0d  h (Exception e).
4a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
4a40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4a50: 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74      Console.Writ
4a60: 65 4c 69 6e 65 28 65 29 3b 0d 0a 20 20 20 20 20  eLine(e);..     
4a70: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
4a80: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 6c            finall
4a90: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
4aa0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4ab0: 20 20 20 20 20 20 64 62 2e 41 63 63 65 70 74 41        db.AcceptA
4ac0: 6c 6c 43 68 61 6e 67 65 73 28 29 3b 0d 0a 20 20  llChanges();..  
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
4ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
4af0: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
4b00: 28 22 69 6e 73 65 72 74 65 64 20 7b 30 7d 22 2c  ("inserted {0}",
4b10: 20 63 6f 75 6e 74 73 5b 30 5d 29 3b 0d 0a 20 20   counts[0]);..  
4b20: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4b30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
4b40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64 69  ..      }..#endi
4b50: 66 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20  f....      //.. 
4b60: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 55 73       // NOTE: Us
4b70: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 55  ed to test the U
4b80: 50 44 41 54 45 20 66 69 78 20 28 69 2e 65 2e 20  PDATE fix (i.e. 
4b90: 74 68 65 20 6d 69 73 73 69 6e 67 20 73 65 6d 69  the missing semi
4ba0: 2d 63 6f 6c 6f 6e 0d 0a 20 20 20 20 20 20 2f 2f  -colon..      //
4bb0: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 53 51         in the SQ
4bc0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 74 77  L statement betw
4bd0: 65 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 55  een the actual U
4be0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 0d  PDATE statement.
4bf0: 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20  .      //       
4c00: 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 75  and the follow-u
4c10: 70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  p SELECT stateme
4c20: 6e 74 29 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a  nt)...      //..
4c30: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
4c40: 61 74 69 63 20 69 6e 74 20 55 70 64 61 74 65 54  atic int UpdateT
4c50: 65 73 74 28 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  est()..      {..
4c60: 20 20 20 20 20 20 20 20 20 20 6c 6f 6e 67 5b 5d            long[]
4c70: 20 6f 72 64 65 72 49 64 73 20 3d 20 6e 65 77 20   orderIds = new 
4c80: 6c 6f 6e 67 5b 5d 20 7b 0d 0a 20 20 20 20 20 20  long[] {..      
4c90: 20 20 20 20 20 20 20 20 30 0d 0a 20 20 20 20 20          0..     
4ca0: 20 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20       };....     
4cb0: 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72 74       using (nort
4cc0: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 20  hwindEFEntities 
4cd0: 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69  db = new northwi
4ce0: 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29 0d  ndEFEntities()).
4cf0: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 5b              int[
4d10: 5d 20 63 6f 75 6e 74 73 20 3d 20 7b 20 30 2c 20  ] counts = { 0, 
4d20: 30 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  0 };....        
4d30: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
4d40: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
4d50: 20 2a 52 45 51 55 49 52 45 44 2a 20 54 68 69 73   *REQUIRED* This
4d60: 20 69 73 20 72 65 71 75 69 72 65 64 20 73 6f 20   is required so 
4d70: 74 68 61 74 20 74 68 65 0d 0a 20 20 20 20 20 20  that the..      
4d80: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
4d90: 20 45 6e 74 69 74 79 20 46 72 61 6d 65 77 6f 72   Entity Framewor
4da0: 6b 20 69 73 20 70 72 65 76 65 6e 74 65 64 20 66  k is prevented f
4db0: 72 6f 6d 20 6f 70 65 6e 69 6e 67 0d 0a 20 20 20  rom opening..   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
4dd0: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e      multiple con
4de0: 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
4df0: 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74  underlying SQLit
4e00: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
4e10: 20 2f 2f 20 20 20 20 20 20 20 64 61 74 61 62 61   //       databa
4e20: 73 65 20 28 69 2e 65 2e 20 77 68 69 63 68 20 77  se (i.e. which w
4e30: 6f 75 6c 64 20 72 65 73 75 6c 74 20 69 6e 20 6d  ould result in m
4e40: 75 6c 74 69 70 6c 65 0d 0a 20 20 20 20 20 20 20  ultiple..       
4e50: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
4e60: 49 4d 4d 45 44 49 41 54 45 20 74 72 61 6e 73 61  IMMEDIATE transa
4e70: 63 74 69 6f 6e 73 2c 20 74 68 65 72 65 62 79 20  ctions, thereby 
4e80: 66 61 69 6c 69 6e 67 20 5b 6c 61 74 65 72 0d 0a  failing [later..
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
4ea0: 20 20 20 20 20 20 20 6f 6e 5d 20 77 69 74 68 20         on] with 
4eb0: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 73 29 2e  locking errors).
4ec0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4ed0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
4ee0: 20 20 64 62 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e    db.Connection.
4ef0: 4f 70 65 6e 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Open();....     
4f00: 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
4f10: 74 20 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64  t index = 0; ind
4f20: 65 78 20 3c 20 6f 72 64 65 72 49 64 73 2e 4c 65  ex < orderIds.Le
4f30: 6e 67 74 68 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a  ngth; index++)..
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
4f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f60: 20 20 20 4f 72 64 65 72 73 20 6e 65 77 4f 72 64     Orders newOrd
4f70: 65 72 73 20 3d 20 6e 65 77 20 4f 72 64 65 72 73  ers = new Orders
4f80: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
4f90: 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72 64 65           newOrde
4fa0: 72 73 2e 53 68 69 70 41 64 64 72 65 73 73 20 3d  rs.ShipAddress =
4fb0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
4fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4fd0: 20 20 20 20 20 20 20 22 54 65 73 74 20 4f 72 64         "Test Ord
4fe0: 65 72 20 53 68 69 70 20 41 64 64 72 65 73 73 2c  er Ship Address,
4ff0: 20 49 6e 64 65 78 20 23 7b 30 7d 22 2c 0d 0a 20   Index #{0}",.. 
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 20 20 20 20 20 69 6e 64 65 78 29 3b 0d 0a 0d 0a       index);....
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 64 62 2e 41 64 64 4f 62 6a 65 63 74 28 22    db.AddObject("
5040: 4f 72 64 65 72 73 22 2c 20 6e 65 77 4f 72 64 65  Orders", newOrde
5050: 72 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rs);....        
5060: 20 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20            try.. 
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
5090: 20 20 20 20 20 20 20 20 20 20 64 62 2e 53 61 76            db.Sav
50a0: 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a 20 20 20  eChanges();..   
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 20 63 6f 75 6e 74 73 5b 30 5d 2b 2b 3b 0d     counts[0]++;.
50d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
50e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 53 74 6f 72           // Stor
50f0: 65 47 65 6e 65 72 61 74 65 64 50 61 74 74 65 72  eGeneratedPatter
5100: 6e 3d 22 49 64 65 6e 74 69 74 79 22 0d 0a 20 20  n="Identity"..  
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 20 20 20 6f 72 64 65 72 49 64 73 5b 69 6e 64      orderIds[ind
5130: 65 78 5d 20 3d 20 6e 65 77 4f 72 64 65 72 73 2e  ex] = newOrders.
5140: 4f 72 64 65 72 49 44 3b 0d 0a 0d 0a 20 20 20 20  OrderID;....    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 20 20 2f 2f 20 53 74 6f 72 65 47 65 6e 65 72 61    // StoreGenera
5170: 74 65 64 50 61 74 74 65 72 6e 3d 22 4e 6f 6e 65  tedPattern="None
5180: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "..             
5190: 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72 64 65           newOrde
51a0: 72 73 2e 53 68 69 70 41 64 64 72 65 73 73 20 3d  rs.ShipAddress =
51b0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
51c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51d0: 20 20 20 20 20 20 20 20 20 20 20 22 4e 65 77 20             "New 
51e0: 4f 72 64 65 72 20 53 68 69 70 20 41 64 64 72 65  Order Ship Addre
51f0: 73 73 20 23 7b 30 7d 22 2c 0d 0a 20 20 20 20 20  ss #{0}",..     
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 6f 72 64 65 72 49 64 73 5b 69 6e       orderIds[in
5220: 64 65 78 5d 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  dex]);....      
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 2f 2f 20 53 74 6f 72 65 47 65 6e 65 72 61 74 65  // StoreGenerate
5250: 64 50 61 74 74 65 72 6e 3d 22 43 6f 6d 70 75 74  dPattern="Comput
5260: 65 64 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed"..           
5270: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72             newOr
5280: 64 65 72 73 2e 46 72 65 69 67 68 74 20 3d 20 31  ders.Freight = 1
5290: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
52a0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2e 53 61             db.Sa
52b0: 76 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a 20 20  veChanges();..  
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 63 6f 75 6e 74 73 5b 31 5d 2b 2b 3b      counts[1]++;
52e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
52f0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
5300: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
5310: 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20  Exception e)..  
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5340: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
5350: 2e 57 72 69 74 65 4c 69 6e 65 28 65 29 3b 0d 0a  .WriteLine(e);..
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
5380: 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a         finally..
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
53b0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2e 41 63             db.Ac
53c0: 63 65 70 74 41 6c 6c 43 68 61 6e 67 65 73 28 29  ceptAllChanges()
53d0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
53e0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
53f0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
5400: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
5410: 2e 57 72 69 74 65 4c 69 6e 65 28 0d 0a 20 20 20  .WriteLine(..   
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5430: 69 6e 73 65 72 74 65 64 20 7b 30 7d 20 75 70 64  inserted {0} upd
5440: 61 74 65 64 20 7b 31 7d 22 2c 20 63 6f 75 6e 74  ated {1}", count
5450: 73 5b 30 5d 2c 20 63 6f 75 6e 74 73 5b 31 5d 29  s[0], counts[1])
5460: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
5470: 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ..          retu
5480: 72 6e 20 30 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  rn 0;..      }..
5490: 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20  ..      //..    
54a0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20    // NOTE: Used 
54b0: 74 6f 20 74 65 73 74 20 74 68 65 20 42 69 6e 61  to test the Bina
54c0: 72 79 47 55 49 44 20 66 69 78 20 28 69 2e 65 2e  ryGUID fix (i.e.
54d0: 20 42 4c 4f 42 20 6c 69 74 65 72 61 6c 20 66 6f   BLOB literal fo
54e0: 72 6d 61 74 74 69 6e 67 0d 0a 20 20 20 20 20 20  rmatting..      
54f0: 2f 2f 20 20 20 20 20 20 20 6f 66 20 47 55 49 44  //       of GUID
5500: 20 76 61 6c 75 65 73 20 77 68 65 6e 20 74 68 65   values when the
5510: 20 42 69 6e 61 72 79 47 55 49 44 20 63 6f 6e 6e   BinaryGUID conn
5520: 65 63 74 69 6f 6e 20 70 72 6f 70 65 72 74 79 20  ection property 
5530: 68 61 73 20 62 65 65 6e 0d 0a 20 20 20 20 20 20  has been..      
5540: 2f 2f 20 20 20 20 20 20 20 65 6e 61 62 6c 65 64  //       enabled
5550: 29 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20  )...      //..  
5560: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
5570: 69 63 20 69 6e 74 20 42 69 6e 61 72 79 47 75 69  ic int BinaryGui
5580: 64 54 65 73 74 28 62 6f 6f 6c 20 62 69 6e 61 72  dTest(bool binar
5590: 79 47 75 69 64 29 0d 0a 20 20 20 20 20 20 7b 0d  yGuid)..      {.
55a0: 0a 20 20 20 20 20 20 20 20 20 20 45 6e 76 69 72  .          Envir
55b0: 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76 69 72 6f  onment.SetEnviro
55c0: 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 28 0d 0a  nmentVariable(..
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
55e0: 70 70 65 6e 64 4d 61 6e 69 66 65 73 74 54 6f 6b  ppendManifestTok
55f0: 65 6e 5f 53 51 4c 69 74 65 50 72 6f 76 69 64 65  en_SQLiteProvide
5600: 72 4d 61 6e 69 66 65 73 74 22 2c 0d 0a 20 20 20  rManifest",..   
5610: 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e             Strin
5620: 67 2e 46 6f 72 6d 61 74 28 22 3b 42 69 6e 61 72  g.Format(";Binar
5630: 79 47 55 49 44 3d 7b 30 7d 3b 22 2c 20 62 69 6e  yGUID={0};", bin
5640: 61 72 79 47 75 69 64 29 29 3b 0d 0a 0d 0a 20 20  aryGuid));....  
5650: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e          using (n
5660: 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69  orthwindEFEntiti
5670: 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74  es db = new nort
5680: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28  hwindEFEntities(
5690: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
56a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
56b0: 74 72 69 6e 67 20 73 71 6c 20 3d 20 22 53 45 4c  tring sql = "SEL
56c0: 45 43 54 20 56 41 4c 55 45 20 47 55 49 44 20 22  ECT VALUE GUID "
56d0: 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   +..            
56e0: 20 20 20 20 20 20 22 27 32 64 33 64 32 64 33 64        "'2d3d2d3d
56f0: 2d 32 64 33 64 2d 32 64 33 64 2d 32 64 33 64 2d  -2d3d-2d3d-2d3d-
5700: 32 64 33 64 32 64 33 64 32 64 33 64 27 20 22 20  2d3d2d3d2d3d' " 
5710: 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +..             
5720: 20 20 20 20 20 22 46 52 4f 4d 20 4f 72 64 65 72       "FROM Order
5730: 73 20 41 53 20 6f 20 57 48 45 52 45 20 6f 2e 4f  s AS o WHERE o.O
5740: 72 64 65 72 49 44 20 3d 20 31 30 32 34 38 3b 22  rderID = 10248;"
5750: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
5760: 20 20 20 4f 62 6a 65 63 74 51 75 65 72 79 3c 73     ObjectQuery<s
5770: 74 72 69 6e 67 3e 20 71 75 65 72 79 20 3d 20 64  tring> query = d
5780: 62 2e 43 72 65 61 74 65 51 75 65 72 79 3c 73 74  b.CreateQuery<st
5790: 72 69 6e 67 3e 28 73 71 6c 29 3b 0d 0a 0d 0a 20  ring>(sql);.... 
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
57b0: 65 61 63 68 20 28 73 74 72 69 6e 67 20 73 20 69  each (string s i
57c0: 6e 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20  n query)..      
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
57e0: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 73 29  ole.WriteLine(s)
57f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  ;..          }..
5800: 0d 0a 20 20 20 20 20 20 20 20 20 20 45 6e 76 69  ..          Envi
5810: 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76 69 72  ronment.SetEnvir
5820: 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 28 0d  onmentVariable(.
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
5840: 41 70 70 65 6e 64 4d 61 6e 69 66 65 73 74 54 6f  AppendManifestTo
5850: 6b 65 6e 5f 53 51 4c 69 74 65 50 72 6f 76 69 64  ken_SQLiteProvid
5860: 65 72 4d 61 6e 69 66 65 73 74 22 2c 0d 0a 20 20  erManifest",..  
5870: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c              null
5880: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
5890: 72 65 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 20  return 0;..     
58a0: 20 7d 0d 0a 0d 0a 23 69 66 20 4e 45 54 5f 34 30   }....#if NET_40
58b0: 20 7c 7c 20 4e 45 54 5f 34 35 20 7c 7c 20 4e 45   || NET_45 || NE
58c0: 54 5f 34 35 31 20 7c 7c 20 4e 45 54 5f 34 36 0d  T_451 || NET_46.
58d0: 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20  .      //..     
58e0: 20 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20 74   // NOTE: Used t
58f0: 6f 20 74 65 73 74 20 74 68 65 20 42 69 6e 61 72  o test the Binar
5900: 79 47 55 49 44 20 63 6f 6e 6e 65 63 74 69 6f 6e  yGUID connection
5910: 20 73 74 72 69 6e 67 20 70 72 6f 70 65 72 74 79   string property
5920: 20 77 69 74 68 0d 0a 20 20 20 20 20 20 2f 2f 20   with..      // 
5930: 20 20 20 20 20 20 74 68 65 20 43 6f 6e 74 61 69        the Contai
5940: 6e 73 28 29 20 66 75 6e 63 74 69 6f 6e 20 28 74  ns() function (t
5950: 69 63 6b 65 74 20 5b 61 34 64 39 63 37 65 65 39  icket [a4d9c7ee9
5960: 34 5d 29 2e 20 20 57 65 20 63 61 6e 6e 6f 74 0d  4]).  We cannot.
5970: 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20  .      //       
5980: 75 73 65 20 74 68 65 20 43 6f 6e 74 61 69 6e 73  use the Contains
5990: 20 65 78 74 65 6e 73 69 6f 6e 20 6d 65 74 68 6f   extension metho
59a0: 64 20 77 69 74 68 69 6e 20 61 20 4c 49 4e 51 20  d within a LINQ 
59b0: 71 75 65 72 79 20 77 69 74 68 0d 0a 20 20 20 20  query with..    
59c0: 20 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20 2e    //       the .
59d0: 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 33 2e  NET Framework 3.
59e0: 35 2e 0d 0a 20 20 20 20 20 20 2f 2f 0d 0a 20 20  5...      //..  
59f0: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
5a00: 69 63 20 69 6e 74 20 42 69 6e 61 72 79 47 75 69  ic int BinaryGui
5a10: 64 54 65 73 74 32 28 62 6f 6f 6c 20 62 69 6e 61  dTest2(bool bina
5a20: 72 79 47 75 69 64 29 0d 0a 20 20 20 20 20 20 7b  ryGuid)..      {
5a30: 0d 0a 20 20 20 20 20 20 20 20 20 20 45 6e 76 69  ..          Envi
5a40: 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76 69 72  ronment.SetEnvir
5a50: 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 28 0d  onmentVariable(.
5a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
5a70: 41 70 70 65 6e 64 4d 61 6e 69 66 65 73 74 54 6f  AppendManifestTo
5a80: 6b 65 6e 5f 53 51 4c 69 74 65 50 72 6f 76 69 64  ken_SQLiteProvid
5a90: 65 72 4d 61 6e 69 66 65 73 74 22 2c 0d 0a 20 20  erManifest",..  
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
5ab0: 6e 67 2e 46 6f 72 6d 61 74 28 22 3b 42 69 6e 61  ng.Format(";Bina
5ac0: 72 79 47 55 49 44 3d 7b 30 7d 3b 22 2c 20 62 69  ryGUID={0};", bi
5ad0: 6e 61 72 79 47 75 69 64 29 29 3b 0d 0a 0d 0a 20  naryGuid));.... 
5ae0: 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
5af0: 6e 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74  northwindEFEntit
5b00: 69 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72  ies db = new nor
5b10: 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73  thwindEFEntities
5b20: 28 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ())..          {
5b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5b40: 47 75 69 64 20 67 75 69 64 20 3d 20 6e 65 77 20  Guid guid = new 
5b50: 47 75 69 64 28 22 32 64 33 64 32 64 33 64 2d 32  Guid("2d3d2d3d-2
5b60: 64 33 64 2d 32 64 33 64 2d 32 64 33 64 2d 32 64  d3d-2d3d-2d3d-2d
5b70: 33 64 32 64 33 64 32 64 33 64 22 29 3b 0d 0a 20  3d2d3d2d3d");.. 
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69               Gui
5b90: 64 5b 5d 20 67 75 69 64 73 20 3d 20 6e 65 77 20  d[] guids = new 
5ba0: 47 75 69 64 5b 5d 20 7b 20 67 75 69 64 20 7d 3b  Guid[] { guid };
5bb0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5bc0: 20 20 62 6f 6f 6c 20 6f 6e 63 65 20 3d 20 66 61    bool once = fa
5bd0: 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
5be0: 20 20 20 20 76 61 72 20 71 75 65 72 79 20 3d 20      var query = 
5bf0: 66 72 6f 6d 20 74 20 69 6e 20 64 62 2e 54 65 72  from t in db.Ter
5c00: 72 69 74 6f 72 69 65 73 0d 0a 20 20 20 20 20 20  ritories..      
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 77 68 65 72 65 20 67 75 69 64 73 2e      where guids.
5c30: 41 73 51 75 65 72 79 61 62 6c 65 3c 47 75 69 64  AsQueryable<Guid
5c40: 3e 28 29 2e 43 6f 6e 74 61 69 6e 73 3c 47 75 69  >().Contains<Gui
5c50: 64 3e 28 67 75 69 64 29 0d 0a 20 20 20 20 20 20  d>(guid)..      
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c70: 20 20 20 20 6f 72 64 65 72 62 79 20 74 2e 54 65      orderby t.Te
5c80: 72 72 69 74 6f 72 79 49 44 0d 0a 20 20 20 20 20  rritoryID..     
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 20 20 20 73 65 6c 65 63 74 20 74 3b 0d 0a       select t;..
5cb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5cc0: 66 6f 72 65 61 63 68 20 28 54 65 72 72 69 74 6f  foreach (Territo
5cd0: 72 69 65 73 20 74 20 69 6e 20 71 75 65 72 79 29  ries t in query)
5ce0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5cf0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5d00: 20 20 20 20 20 69 66 20 28 6f 6e 63 65 29 0d 0a       if (once)..
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72        Console.Wr
5d30: 69 74 65 28 27 20 27 29 3b 0d 0a 0d 0a 20 20 20  ite(' ');....   
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
5d50: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 74 2e 54  onsole.Write(t.T
5d60: 65 72 72 69 74 6f 72 79 49 44 29 3b 0d 0a 0d 0a  erritoryID);....
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 6f 6e 63 65 20 3d 20 74 72 75 65 3b 0d 0a    once = true;..
5d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
5da0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  .          }....
5db0: 20 20 20 20 20 20 20 20 20 20 45 6e 76 69 72 6f            Enviro
5dc0: 6e 6d 65 6e 74 2e 53 65 74 45 6e 76 69 72 6f 6e  nment.SetEnviron
5dd0: 6d 65 6e 74 56 61 72 69 61 62 6c 65 28 0d 0a 20  mentVariable(.. 
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 70               "Ap
5df0: 70 65 6e 64 4d 61 6e 69 66 65 73 74 54 6f 6b 65  pendManifestToke
5e00: 6e 5f 53 51 4c 69 74 65 50 72 6f 76 69 64 65 72  n_SQLiteProvider
5e10: 4d 61 6e 69 66 65 73 74 22 2c 0d 0a 20 20 20 20  Manifest",..    
5e20: 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 29 3b            null);
5e30: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 72 65  ....          re
5e40: 74 75 72 6e 20 30 3b 0d 0a 20 20 20 20 20 20 7d  turn 0;..      }
5e50: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20 20  ..#endif....    
5e60: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
5e70: 20 69 6e 74 20 43 6f 6d 70 6c 65 78 50 72 69 6d   int ComplexPrim
5e80: 61 72 79 4b 65 79 54 65 73 74 28 29 0d 0a 20 20  aryKeyTest()..  
5e90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
5ea0: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 53 65 74   Environment.Set
5eb0: 45 6e 76 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61  EnvironmentVaria
5ec0: 62 6c 65 28 22 53 51 4c 69 74 65 5f 46 6f 72 63  ble("SQLite_Forc
5ed0: 65 4c 6f 67 50 72 65 70 61 72 65 22 2c 20 22 31  eLogPrepare", "1
5ee0: 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
5ef0: 20 75 73 69 6e 67 20 28 6e 6f 72 74 68 77 69 6e   using (northwin
5f00: 64 45 46 45 6e 74 69 74 69 65 73 20 64 62 20 3d  dEFEntities db =
5f10: 20 6e 65 77 20 6e 6f 72 74 68 77 69 6e 64 45 46   new northwindEF
5f20: 45 6e 74 69 74 69 65 73 28 29 29 0d 0a 20 20 20  Entities())..   
5f30: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
5f40: 20 20 20 20 20 20 20 20 69 6e 74 5b 5d 20 63 6f          int[] co
5f50: 75 6e 74 73 20 3d 20 7b 20 30 2c 20 30 20 7d 3b  unts = { 0, 0 };
5f60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5f70: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
5f80: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 2a 52 45      // NOTE: *RE
5f90: 51 55 49 52 45 44 2a 20 54 68 69 73 20 69 73 20  QUIRED* This is 
5fa0: 72 65 71 75 69 72 65 64 20 73 6f 20 74 68 61 74  required so that
5fb0: 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
5fc0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 45 6e 74      //       Ent
5fd0: 69 74 79 20 46 72 61 6d 65 77 6f 72 6b 20 69 73  ity Framework is
5fe0: 20 70 72 65 76 65 6e 74 65 64 20 66 72 6f 6d 20   prevented from 
5ff0: 6f 70 65 6e 69 6e 67 0d 0a 20 20 20 20 20 20 20  opening..       
6000: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
6010: 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 6e 65 63 74  multiple connect
6020: 69 6f 6e 73 20 74 6f 20 74 68 65 20 75 6e 64 65  ions to the unde
6030: 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 0d 0a 20  rlying SQLite.. 
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
6050: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
6060: 69 2e 65 2e 20 77 68 69 63 68 20 77 6f 75 6c 64  i.e. which would
6070: 20 72 65 73 75 6c 74 20 69 6e 20 6d 75 6c 74 69   result in multi
6080: 70 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ple..           
6090: 20 20 20 2f 2f 20 20 20 20 20 20 20 49 4d 4d 45     //       IMME
60a0: 44 49 41 54 45 20 74 72 61 6e 73 61 63 74 69 6f  DIATE transactio
60b0: 6e 73 2c 20 74 68 65 72 65 62 79 20 66 61 69 6c  ns, thereby fail
60c0: 69 6e 67 20 5b 6c 61 74 65 72 0d 0a 20 20 20 20  ing [later..    
60d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
60e0: 20 20 20 6f 6e 5d 20 77 69 74 68 20 6c 6f 63 6b     on] with lock
60f0: 69 6e 67 20 65 72 72 6f 72 73 29 2e 0d 0a 20 20  ing errors)...  
6100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
6120: 2e 43 6f 6e 6e 65 63 74 69 6f 6e 2e 4f 70 65 6e  .Connection.Open
6130: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
6140: 20 20 20 20 20 45 6e 74 69 74 79 4b 65 79 20 65       EntityKey e
6150: 6e 74 69 74 79 4b 65 79 20 3d 20 6e 65 77 20 45  ntityKey = new E
6160: 6e 74 69 74 79 4b 65 79 28 22 6e 6f 72 74 68 77  ntityKey("northw
6170: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 2e 4f 72  indEFEntities.Or
6180: 64 65 72 44 65 74 61 69 6c 73 22 2c 0d 0a 20 20  derDetails",..  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 6e 65 77 20 4b 65 79 56 61 6c 75 65 50 61 69 72  new KeyValuePair
61b0: 3c 73 74 72 69 6e 67 2c 20 6f 62 6a 65 63 74 3e  <string, object>
61c0: 5b 5d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20  [] {..          
61d0: 20 20 20 20 20 20 20 20 6e 65 77 20 4b 65 79 56          new KeyV
61e0: 61 6c 75 65 50 61 69 72 3c 73 74 72 69 6e 67 2c  aluePair<string,
61f0: 20 6f 62 6a 65 63 74 3e 28 22 4f 72 64 65 72 49   object>("OrderI
6200: 44 22 2c 20 28 6c 6f 6e 67 29 31 30 32 34 38 29  D", (long)10248)
6210: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
6220: 20 20 20 20 20 6e 65 77 20 4b 65 79 56 61 6c 75       new KeyValu
6230: 65 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 6f 62  ePair<string, ob
6240: 6a 65 63 74 3e 28 22 50 72 6f 64 75 63 74 49 44  ject>("ProductID
6250: 22 2c 20 28 6c 6f 6e 67 29 31 29 0d 0a 20 20 20  ", (long)1)..   
6260: 20 20 20 20 20 20 20 20 20 20 20 7d 29 3b 0d 0a             });..
6270: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6280: 4f 72 64 65 72 44 65 74 61 69 6c 73 20 6e 65 77  OrderDetails new
6290: 4f 72 64 65 72 44 65 74 61 69 6c 73 20 3d 20 6e  OrderDetails = n
62a0: 65 77 20 4f 72 64 65 72 44 65 74 61 69 6c 73 28  ew OrderDetails(
62b0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
62c0: 20 20 20 20 6e 65 77 4f 72 64 65 72 44 65 74 61      newOrderDeta
62d0: 69 6c 73 2e 45 6e 74 69 74 79 4b 65 79 20 3d 20  ils.EntityKey = 
62e0: 65 6e 74 69 74 79 4b 65 79 3b 0d 0a 20 20 20 20  entityKey;..    
62f0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72 64            newOrd
6300: 65 72 44 65 74 61 69 6c 73 2e 4f 72 64 65 72 49  erDetails.OrderI
6310: 44 20 3d 20 31 30 32 34 38 3b 0d 0a 20 20 20 20  D = 10248;..    
6320: 20 20 20 20 20 20 20 20 20 20 6e 65 77 4f 72 64            newOrd
6330: 65 72 44 65 74 61 69 6c 73 2e 50 72 6f 64 75 63  erDetails.Produc
6340: 74 49 44 20 3d 20 31 3b 0d 0a 20 20 20 20 20 20  tID = 1;..      
6350: 20 20 20 20 20 20 20 20 6e 65 77 4f 72 64 65 72          newOrder
6360: 44 65 74 61 69 6c 73 2e 55 6e 69 74 50 72 69 63  Details.UnitPric
6370: 65 20 3d 20 28 64 65 63 69 6d 61 6c 29 31 2e 32  e = (decimal)1.2
6380: 33 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  3;..            
6390: 20 20 6e 65 77 4f 72 64 65 72 44 65 74 61 69 6c    newOrderDetail
63a0: 73 2e 51 75 61 6e 74 69 74 79 20 3d 20 31 3b 0d  s.Quantity = 1;.
63b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
63c0: 65 77 4f 72 64 65 72 44 65 74 61 69 6c 73 2e 44  ewOrderDetails.D
63d0: 69 73 63 6f 75 6e 74 20 3d 20 30 2e 30 66 3b 0d  iscount = 0.0f;.
63e0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
63f0: 20 64 62 2e 41 74 74 61 63 68 28 6e 65 77 4f 72   db.Attach(newOr
6400: 64 65 72 44 65 74 61 69 6c 73 29 3b 0d 0a 0d 0a  derDetails);....
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
6420: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
6430: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
6440: 20 20 20 20 20 20 64 62 2e 53 61 76 65 43 68 61        db.SaveCha
6450: 6e 67 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20  nges();..       
6460: 20 20 20 20 20 20 20 20 20 20 20 63 6f 75 6e 74             count
6470: 73 5b 30 5d 2b 2b 3b 0d 0a 20 20 20 20 20 20 20  s[0]++;..       
6480: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6490: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
64a0: 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20  xception e)..   
64b0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e  Console.WriteLin
64e0: 65 28 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  e(e);..         
64f0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
6500: 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20        finally.. 
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 64 62 2e 41 63 63 65 70 74 41 6c 6c 43 68    db.AcceptAllCh
6540: 61 6e 67 65 73 28 29 3b 0d 0a 20 20 20 20 20 20  anges();..      
6550: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
6560: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f             Conso
6570: 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 69 6e  le.WriteLine("in
6580: 73 65 72 74 65 64 20 7b 30 7d 22 2c 20 63 6f 75  serted {0}", cou
6590: 6e 74 73 5b 30 5d 29 3b 0d 0a 20 20 20 20 20 20  nts[0]);..      
65a0: 20 20 20 20 20 20 20 20 64 62 2e 52 65 66 72 65          db.Refre
65b0: 73 68 28 52 65 66 72 65 73 68 4d 6f 64 65 2e 53  sh(RefreshMode.S
65c0: 74 6f 72 65 57 69 6e 73 2c 20 6e 65 77 4f 72 64  toreWins, newOrd
65d0: 65 72 44 65 74 61 69 6c 73 29 3b 0d 0a 0d 0a 20  erDetails);.... 
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f               ///
65f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
6630: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6640: 6e 65 77 4f 72 64 65 72 44 65 74 61 69 6c 73 2e  newOrderDetails.
6650: 45 6e 74 69 74 79 4b 65 79 20 3d 20 65 6e 74 69  EntityKey = enti
6660: 74 79 4b 65 79 3b 0d 0a 20 20 20 20 20 20 20 20  tyKey;..        
6670: 20 20 20 20 20 20 6e 65 77 4f 72 64 65 72 44 65        newOrderDe
6680: 74 61 69 6c 73 2e 55 6e 69 74 50 72 69 63 65 20  tails.UnitPrice 
6690: 3d 20 28 64 65 63 69 6d 61 6c 29 32 2e 33 34 3b  = (decimal)2.34;
66a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
66b0: 6e 65 77 4f 72 64 65 72 44 65 74 61 69 6c 73 2e  newOrderDetails.
66c0: 51 75 61 6e 74 69 74 79 20 3d 20 32 3b 0d 0a 20  Quantity = 2;.. 
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
66e0: 4f 72 64 65 72 44 65 74 61 69 6c 73 2e 44 69 73  OrderDetails.Dis
66f0: 63 6f 75 6e 74 20 3d 20 30 2e 31 66 3b 0d 0a 0d  count = 0.1f;...
6700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
6710: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
6720: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
6730: 20 20 20 20 20 20 20 64 62 2e 53 61 76 65 43 68         db.SaveCh
6740: 61 6e 67 65 73 28 29 3b 0d 0a 20 20 20 20 20 20  anges();..      
6750: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 75 6e              coun
6760: 74 73 5b 31 5d 2b 2b 3b 0d 0a 20 20 20 20 20 20  ts[1]++;..      
6770: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6780: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
6790: 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20  Exception e)..  
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
67d0: 6e 65 28 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  ne(e);..        
67e0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
67f0: 20 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a         finally..
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
6810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6820: 20 20 20 64 62 2e 41 63 63 65 70 74 41 6c 6c 43     db.AcceptAllC
6830: 68 61 6e 67 65 73 28 29 3b 0d 0a 20 20 20 20 20  hanges();..     
6840: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
6850: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73              Cons
6860: 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28 22 75  ole.WriteLine("u
6870: 70 64 61 74 65 64 20 7b 30 7d 22 2c 20 63 6f 75  pdated {0}", cou
6880: 6e 74 73 5b 31 5d 29 3b 0d 0a 20 20 20 20 20 20  nts[1]);..      
6890: 20 20 20 20 20 20 20 20 64 62 2e 52 65 66 72 65          db.Refre
68a0: 73 68 28 52 65 66 72 65 73 68 4d 6f 64 65 2e 53  sh(RefreshMode.S
68b0: 74 6f 72 65 57 69 6e 73 2c 20 6e 65 77 4f 72 64  toreWins, newOrd
68c0: 65 72 44 65 74 61 69 6c 73 29 3b 0d 0a 20 20 20  erDetails);..   
68d0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
68e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0d        return 0;.
68f0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6900: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
6910: 20 69 6e 74 20 44 61 74 65 54 69 6d 65 54 65 73   int DateTimeTes
6920: 74 28 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  t()..      {..  
6930: 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e          using (n
6940: 6f 72 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69  orthwindEFEntiti
6950: 65 73 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74  es db = new nort
6960: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28  hwindEFEntities(
6970: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d  ))..          {.
6980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44  .              D
6990: 61 74 65 54 69 6d 65 20 64 61 74 65 54 69 6d 65  ateTime dateTime
69a0: 20 3d 20 6e 65 77 20 44 61 74 65 54 69 6d 65 28   = new DateTime(
69b0: 31 39 39 37 2c 20 31 2c 20 31 2c 20 30 2c 20 30  1997, 1, 1, 0, 0
69c0: 2c 20 30 2c 20 44 61 74 65 54 69 6d 65 4b 69 6e  , 0, DateTimeKin
69d0: 64 2e 4c 6f 63 61 6c 29 3b 0d 0a 20 20 20 20 20  d.Local);..     
69e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 31 20           int c1 
69f0: 3d 20 64 62 2e 4f 72 64 65 72 73 2e 57 68 65 72  = db.Orders.Wher
6a00: 65 28 69 20 3d 3e 20 69 2e 4f 72 64 65 72 44 61  e(i => i.OrderDa
6a10: 74 65 20 3d 3d 20 6e 65 77 20 44 61 74 65 54 69  te == new DateTi
6a20: 6d 65 28 31 39 39 37 2c 20 31 2c 20 31 2c 20 30  me(1997, 1, 1, 0
6a30: 2c 20 30 2c 20 30 2c 20 44 61 74 65 54 69 6d 65  , 0, 0, DateTime
6a40: 4b 69 6e 64 2e 4c 6f 63 61 6c 29 29 2e 43 6f 75  Kind.Local)).Cou
6a50: 6e 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  nt();..         
6a60: 20 20 20 20 20 69 6e 74 20 63 32 20 3d 20 64 62       int c2 = db
6a70: 2e 4f 72 64 65 72 73 2e 57 68 65 72 65 28 69 20  .Orders.Where(i 
6a80: 3d 3e 20 69 2e 4f 72 64 65 72 44 61 74 65 20 3d  => i.OrderDate =
6a90: 3d 20 64 61 74 65 54 69 6d 65 29 2e 43 6f 75 6e  = dateTime).Coun
6aa0: 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  t();..          
6ab0: 20 20 20 20 72 65 74 75 72 6e 20 63 31 20 3d 3d      return c1 ==
6ac0: 20 63 32 20 3f 20 30 20 3a 20 31 3b 0d 0a 20 20   c2 ? 0 : 1;..  
6ad0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
6ae0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 72 69 76   }....      priv
6af0: 61 74 65 20 73 74 61 74 69 63 20 76 6f 69 64 20  ate static void 
6b00: 44 61 74 65 54 69 6d 65 54 65 73 74 32 28 0d 0a  DateTimeTest2(..
6b10: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
6b20: 20 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 0d   dateTimeFormat.
6b30: 0a 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20  .          )..  
6b40: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6b50: 20 54 72 61 63 65 4c 69 73 74 65 6e 65 72 20 6c   TraceListener l
6b60: 69 73 74 65 6e 65 72 20 3d 20 6e 65 77 20 43 6f  istener = new Co
6b70: 6e 73 6f 6c 65 54 72 61 63 65 4c 69 73 74 65 6e  nsoleTraceListen
6b80: 65 72 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  er();....       
6b90: 20 20 20 54 72 61 63 65 2e 4c 69 73 74 65 6e 65     Trace.Listene
6ba0: 72 73 2e 41 64 64 28 6c 69 73 74 65 6e 65 72 29  rs.Add(listener)
6bb0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 45 6e 76  ;..          Env
6bc0: 69 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76 69  ironment.SetEnvi
6bd0: 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 28  ronmentVariable(
6be0: 22 53 51 4c 69 74 65 5f 46 6f 72 63 65 4c 6f 67  "SQLite_ForceLog
6bf0: 50 72 65 70 61 72 65 22 2c 20 22 31 22 29 3b 0d  Prepare", "1");.
6c00: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  ...          if 
6c10: 28 64 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 20  (dateTimeFormat 
6c20: 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
6c30: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6c40: 20 20 20 20 20 45 6e 76 69 72 6f 6e 6d 65 6e 74       Environment
6c50: 2e 53 65 74 45 6e 76 69 72 6f 6e 6d 65 6e 74 56  .SetEnvironmentV
6c60: 61 72 69 61 62 6c 65 28 0d 0a 20 20 20 20 20 20  ariable(..      
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 22 41 70 70              "App
6c80: 65 6e 64 4d 61 6e 69 66 65 73 74 54 6f 6b 65 6e  endManifestToken
6c90: 5f 53 51 4c 69 74 65 50 72 6f 76 69 64 65 72 4d  _SQLiteProviderM
6ca0: 61 6e 69 66 65 73 74 22 2c 0d 0a 20 20 20 20 20  anifest",..     
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72               Str
6cc0: 69 6e 67 2e 46 6f 72 6d 61 74 28 22 3b 44 61 74  ing.Format(";Dat
6cd0: 65 54 69 6d 65 46 6f 72 6d 61 74 3d 7b 30 7d 3b  eTimeFormat={0};
6ce0: 22 2c 20 64 61 74 65 54 69 6d 65 46 6f 72 6d 61  ", dateTimeForma
6cf0: 74 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  t));..          
6d00: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 75  }....          u
6d10: 73 69 6e 67 20 28 6e 6f 72 74 68 77 69 6e 64 45  sing (northwindE
6d20: 46 45 6e 74 69 74 69 65 73 20 64 62 20 3d 20 6e  FEntities db = n
6d30: 65 77 20 6e 6f 72 74 68 77 69 6e 64 45 46 45 6e  ew northwindEFEn
6d40: 74 69 74 69 65 73 28 29 29 0d 0a 20 20 20 20 20  tities())..     
6d50: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
6d60: 20 20 20 20 20 20 64 62 2e 4f 72 64 65 72 73 2e        db.Orders.
6d70: 57 68 65 72 65 28 69 20 3d 3e 20 69 2e 4f 72 64  Where(i => i.Ord
6d80: 65 72 44 61 74 65 20 3c 0d 0a 20 20 20 20 20 20  erDate <..      
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20              new 
6da0: 44 61 74 65 54 69 6d 65 28 31 39 39 37 2c 20 31  DateTime(1997, 1
6db0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 44 61  , 1, 0, 0, 0, Da
6dc0: 74 65 54 69 6d 65 4b 69 6e 64 2e 4c 6f 63 61 6c  teTimeKind.Local
6dd0: 29 29 2e 43 6f 75 6e 74 28 29 3b 0d 0a 20 20 20  )).Count();..   
6de0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
6df0: 20 20 20 20 20 20 69 66 20 28 64 61 74 65 54 69        if (dateTi
6e00: 6d 65 46 6f 72 6d 61 74 20 21 3d 20 6e 75 6c 6c  meFormat != null
6e10: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  )..          {..
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 6e                En
6e30: 76 69 72 6f 6e 6d 65 6e 74 2e 53 65 74 45 6e 76  vironment.SetEnv
6e40: 69 72 6f 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65  ironmentVariable
6e50: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
6e60: 20 20 20 20 20 22 41 70 70 65 6e 64 4d 61 6e 69       "AppendMani
6e70: 66 65 73 74 54 6f 6b 65 6e 5f 53 51 4c 69 74 65  festToken_SQLite
6e80: 50 72 6f 76 69 64 65 72 4d 61 6e 69 66 65 73 74  ProviderManifest
6e90: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
6ea0: 20 20 20 20 20 20 6e 75 6c 6c 29 3b 0d 0a 20 20        null);..  
6eb0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
6ec0: 20 20 20 20 20 20 20 45 6e 76 69 72 6f 6e 6d 65         Environme
6ed0: 6e 74 2e 53 65 74 45 6e 76 69 72 6f 6e 6d 65 6e  nt.SetEnvironmen
6ee0: 74 56 61 72 69 61 62 6c 65 28 22 53 51 4c 69 74  tVariable("SQLit
6ef0: 65 5f 46 6f 72 63 65 4c 6f 67 50 72 65 70 61 72  e_ForceLogPrepar
6f00: 65 22 2c 20 6e 75 6c 6c 29 3b 0d 0a 20 20 20 20  e", null);..    
6f10: 20 20 20 20 20 20 54 72 61 63 65 2e 4c 69 73 74        Trace.List
6f20: 65 6e 65 72 73 2e 52 65 6d 6f 76 65 28 6c 69 73  eners.Remove(lis
6f30: 74 65 6e 65 72 29 3b 0d 0a 20 20 20 20 20 20 7d  tener);..      }
6f40: 0d 0a 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c  ....#if NET_40 |
6f50: 7c 20 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f  | NET_45 || NET_
6f60: 34 35 31 20 7c 7c 20 4e 45 54 5f 34 36 0d 0a 20  451 || NET_46.. 
6f70: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 2f       //..      /
6f80: 2f 20 4e 4f 54 45 3a 20 55 73 65 64 20 74 6f 20  / NOTE: Used to 
6f90: 74 65 73 74 20 74 68 65 20 52 4f 55 4e 44 20 66  test the ROUND f
6fa0: 69 78 20 28 69 2e 65 2e 20 62 65 69 6e 67 20 61  ix (i.e. being a
6fb0: 62 6c 65 20 74 6f 20 70 72 6f 70 65 72 6c 79 20  ble to properly 
6fc0: 68 61 6e 64 6c 65 0d 0a 20 20 20 20 20 20 2f 2f  handle..      //
6fd0: 20 20 20 20 20 20 20 74 68 65 20 74 77 6f 20 61         the two a
6fe0: 72 67 75 6d 65 6e 74 20 66 6f 72 6d 29 2e 0d 0a  rgument form)...
6ff0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
7000: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69  private static i
7010: 6e 74 20 52 6f 75 6e 64 54 65 73 74 28 29 0d 0a  nt RoundTest()..
7020: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
7030: 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72 74       using (nort
7040: 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73 20  hwindEFEntities 
7050: 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77 69  db = new northwi
7060: 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29 0d  ndEFEntities()).
7070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 62 6f 6f 6c 20 6f 6e 63 65 20 3d 20 66 61 6c 73  bool once = fals
70a0: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
70b0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 69        foreach (i
70c0: 6e 74 5b 5d 20 69 20 69 6e 20 6e 65 77 20 69 6e  nt[] i in new in
70d0: 74 5b 5d 5b 5d 20 7b 0d 0a 20 20 20 20 20 20 20  t[][] {..       
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 6e 65 77 20 69 6e 74 5b 5d 20 7b 20 31 30 35   new int[] { 105
7100: 30 33 2c 20 36 35 20 7d 2c 0d 0a 20 20 20 20 20  03, 65 },..     
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 20 6e 65 77 20 69 6e 74 5b 5d 20 7b 20 31     new int[] { 1
7130: 30 35 30 33 2c 20 31 34 20 7d 2c 0d 0a 20 20 20  0503, 14 },..   
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 6e 65 77 20 69 6e 74 5b 5d 20 7b       new int[] {
7160: 20 31 30 36 33 35 2c 20 35 20 7d 0d 0a 20 20 20   10635, 5 }..   
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 7d 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   })..           
7190: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
71b0: 28 69 6e 74 20 6a 20 3d 20 30 3b 20 6a 20 3c 20  (int j = 0; j < 
71c0: 33 3b 20 6a 2b 2b 29 0d 0a 20 20 20 20 20 20 20  3; j++)..       
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 69 64 20          int oid 
7200: 3d 20 69 5b 30 5d 3b 0d 0a 20 20 20 20 20 20 20  = i[0];..       
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 69 6e 74 20 70 69 64 20 3d 20 69 5b 31 5d 3b   int pid = i[1];
7230: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
7240: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
7250: 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 6f 20 69  query = from o i
7260: 6e 20 64 62 2e 4f 72 64 65 72 44 65 74 61 69 6c  n db.OrderDetail
7270: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s..             
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 20 20 20 20 77 68 65 72 65 20 6f 2e 4f         where o.O
72a0: 72 64 65 72 49 44 20 3d 3d 20 6f 69 64 20 26 26  rderID == oid &&
72b0: 20 6f 2e 50 72 6f 64 75 63 74 49 44 20 3d 3d 20   o.ProductID == 
72c0: 70 69 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  pid..           
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72e0: 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 20           select 
72f0: 6e 65 77 20 7b 20 4e 65 77 55 6e 69 74 50 72 69  new { NewUnitPri
7300: 63 65 20 3d 20 4d 61 74 68 2e 52 6f 75 6e 64 28  ce = Math.Round(
7310: 6f 2e 55 6e 69 74 50 72 69 63 65 2c 20 6a 29 20  o.UnitPrice, j) 
7320: 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  };....          
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
7340: 72 65 61 63 68 20 28 6f 62 6a 65 63 74 20 6f 20  reach (object o 
7350: 69 6e 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20  in query)..     
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 20 69 66 20 28 6f 6e 63 65 29 0d 0a 20 20 20    if (once)..   
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e               Con
73c0: 73 6f 6c 65 2e 57 72 69 74 65 28 27 20 27 29 3b  sole.Write(' ');
73d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 28 22 7b  Console.Write("{
7400: 30 7d 22 2c 20 6f 29 3b 0d 0a 0d 0a 20 20 20 20  0}", o);....    
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 74          once = t
7430: 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
7450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7460: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7470: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7480: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
74a0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 23 65 6e 64  ;..      }..#end
74b0: 69 66 0d 0a 0d 0a 20 20 20 20 70 72 69 76 61 74  if....    privat
74c0: 65 20 73 74 61 74 69 63 20 69 6e 74 20 4f 6c 64  e static int Old
74d0: 54 65 73 74 73 28 29 0d 0a 20 20 20 20 7b 0d 0a  Tests()..    {..
74e0: 20 20 20 20 20 20 75 73 69 6e 67 20 28 6e 6f 72        using (nor
74f0: 74 68 77 69 6e 64 45 46 45 6e 74 69 74 69 65 73  thwindEFEntities
7500: 20 64 62 20 3d 20 6e 65 77 20 6e 6f 72 74 68 77   db = new northw
7510: 69 6e 64 45 46 45 6e 74 69 74 69 65 73 28 29 29  indEFEntities())
7520: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
7530: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7540: 73 74 72 69 6e 67 20 65 6e 74 69 74 79 53 51 4c  string entitySQL
7550: 20 3d 20 22 53 45 4c 45 43 54 20 56 41 4c 55 45   = "SELECT VALUE
7560: 20 6f 20 46 52 4f 4d 20 4f 72 64 65 72 73 20 41   o FROM Orders A
7570: 53 20 6f 20 57 48 45 52 45 20 53 51 4c 69 74 65  S o WHERE SQLite
7580: 2e 44 61 74 65 50 61 72 74 28 27 79 79 79 79 27  .DatePart('yyyy'
7590: 2c 20 6f 2e 4f 72 64 65 72 44 61 74 65 29 20 3d  , o.OrderDate) =
75a0: 20 31 39 39 37 20 4f 52 44 45 52 20 42 59 20 6f   1997 ORDER BY o
75b0: 2e 4f 72 64 65 72 49 44 3b 22 3b 0d 0a 20 20 20  .OrderID;";..   
75c0: 20 20 20 20 20 20 20 4f 62 6a 65 63 74 51 75 65         ObjectQue
75d0: 72 79 3c 4f 72 64 65 72 73 3e 20 71 75 65 72 79  ry<Orders> query
75e0: 20 3d 20 64 62 2e 43 72 65 61 74 65 51 75 65 72   = db.CreateQuer
75f0: 79 3c 4f 72 64 65 72 73 3e 28 65 6e 74 69 74 79  y<Orders>(entity
7600: 53 51 4c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  SQL);....       
7610: 20 20 20 66 6f 72 65 61 63 68 20 28 4f 72 64 65     foreach (Orde
7620: 72 73 20 6f 20 69 6e 20 71 75 65 72 79 29 0d 0a  rs o in query)..
7630: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
7640: 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65           Console
7650: 2e 57 72 69 74 65 4c 69 6e 65 28 6f 2e 53 68 69  .WriteLine(o.Shi
7660: 70 50 6f 73 74 61 6c 43 6f 64 65 29 3b 0d 0a 20  pPostalCode);.. 
7670: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
7680: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7690: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 76 61   {..          va
76a0: 72 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 63  r query = from c
76b0: 20 69 6e 20 64 62 2e 43 75 73 74 6f 6d 65 72 73   in db.Customers
76c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
76d0: 20 20 20 20 20 20 20 20 77 68 65 72 65 20 63 2e          where c.
76e0: 43 69 74 79 20 3d 3d 20 22 4c 6f 6e 64 6f 6e 22  City == "London"
76f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7700: 20 20 20 20 20 20 20 20 6f 72 64 65 72 62 79 20          orderby 
7710: 63 2e 43 6f 6d 70 61 6e 79 4e 61 6d 65 0d 0a 20  c.CompanyName.. 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 20 73 65 6c 65 63 74 20 63 3b 0d 0a       select c;..
7740: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ..          int 
7750: 63 63 20 3d 20 71 75 65 72 79 2e 43 6f 75 6e 74  cc = query.Count
7760: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
7770: 20 66 6f 72 65 61 63 68 20 28 43 75 73 74 6f 6d   foreach (Custom
7780: 65 72 73 20 63 20 69 6e 20 71 75 65 72 79 29 0d  ers c in query).
7790: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
77a0: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c            Consol
77b0: 65 2e 57 72 69 74 65 4c 69 6e 65 28 63 2e 43 6f  e.WriteLine(c.Co
77c0: 6d 70 61 6e 79 4e 61 6d 65 29 3b 0d 0a 20 20 20  mpanyName);..   
77d0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
77e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b    }....        {
77f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 69  ..          stri
7800: 6e 67 20 73 63 69 74 79 20 3d 20 22 4c 6f 6e 64  ng scity = "Lond
7810: 6f 6e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  on";..          
7820: 43 75 73 74 6f 6d 65 72 73 20 63 20 3d 20 64 62  Customers c = db
7830: 2e 43 75 73 74 6f 6d 65 72 73 2e 46 69 72 73 74  .Customers.First
7840: 4f 72 44 65 66 61 75 6c 74 28 63 64 20 3d 3e 20  OrDefault(cd => 
7850: 63 64 2e 43 69 74 79 20 3d 3d 20 73 63 69 74 79  cd.City == scity
7860: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 43 6f  );..          Co
7870: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
7880: 63 2e 43 6f 6d 70 61 6e 79 4e 61 6d 65 29 3b 0d  c.CompanyName);.
7890: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
78a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
78b0: 20 20 20 44 61 74 65 54 69 6d 65 20 64 74 20 3d     DateTime dt =
78c0: 20 6e 65 77 20 44 61 74 65 54 69 6d 65 28 31 39   new DateTime(19
78d0: 39 37 2c 20 31 2c 20 31 29 3b 0d 0a 20 20 20 20  97, 1, 1);..    
78e0: 20 20 20 20 20 20 76 61 72 20 71 75 65 72 79 20        var query 
78f0: 3d 20 66 72 6f 6d 20 6f 72 64 65 72 20 69 6e 20  = from order in 
7900: 64 62 2e 4f 72 64 65 72 73 0d 0a 20 20 20 20 20  db.Orders..     
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 20 77 68 65 72 65 20 6f 72 64 65 72 2e 4f 72 64   where order.Ord
7930: 65 72 44 61 74 65 20 3c 20 64 74 0d 0a 20 20 20  erDate < dt..   
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 20 6f 72 64 65 72 62 79 20 6f 72 64 65 72     orderby order
7960: 2e 4f 72 64 65 72 49 44 0d 0a 20 20 20 20 20 20  .OrderID..      
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 73 65 6c 65 63 74 20 6f 72 64 65 72 3b 0d 0a 0d  select order;...
7990: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  .          forea
79a0: 63 68 20 28 4f 72 64 65 72 73 20 6f 20 69 6e 20  ch (Orders o in 
79b0: 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20 20  query)..        
79c0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
79d0: 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69   Console.WriteLi
79e0: 6e 65 28 6f 2e 4f 72 64 65 72 44 61 74 65 2e 54  ne(o.OrderDate.T
79f0: 6f 53 74 72 69 6e 67 28 29 29 3b 0d 0a 20 20 20  oString());..   
7a00: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
7a10: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b    }....        {
7a20: 0d 0a 20 20 20 20 20 20 20 20 20 20 43 61 74 65  ..          Cate
7a30: 67 6f 72 69 65 73 20 63 20 3d 20 6e 65 77 20 43  gories c = new C
7a40: 61 74 65 67 6f 72 69 65 73 28 29 3b 0d 0a 20 20  ategories();..  
7a50: 20 20 20 20 20 20 20 20 63 2e 43 61 74 65 67 6f          c.Catego
7a60: 72 79 4e 61 6d 65 20 3d 20 22 54 65 73 74 20 43  ryName = "Test C
7a70: 61 74 65 67 6f 72 79 22 3b 0d 0a 20 20 20 20 20  ategory";..     
7a80: 20 20 20 20 20 63 2e 44 65 73 63 72 69 70 74 69       c.Descripti
7a90: 6f 6e 20 3d 20 22 4d 79 20 44 65 73 63 72 69 70  on = "My Descrip
7aa0: 74 69 6f 6e 22 3b 0d 0a 20 20 20 20 20 20 20 20  tion";..        
7ab0: 20 20 64 62 2e 41 64 64 54 6f 43 61 74 65 67 6f    db.AddToCatego
7ac0: 72 69 65 73 28 63 29 3b 0d 0a 20 20 20 20 20 20  ries(c);..      
7ad0: 20 20 20 20 64 62 2e 53 61 76 65 43 68 61 6e 67      db.SaveChang
7ae0: 65 73 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  es();....       
7af0: 20 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65     Console.Write
7b00: 4c 69 6e 65 28 63 2e 43 61 74 65 67 6f 72 79 49  Line(c.CategoryI
7b10: 44 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  D);....         
7b20: 20 63 2e 44 65 73 63 72 69 70 74 69 6f 6e 20 3d   c.Description =
7b30: 20 22 4d 79 20 6d 6f 64 69 66 69 65 64 20 64 65   "My modified de
7b40: 73 63 72 69 70 74 69 6f 6e 22 3b 0d 0a 20 20 20  scription";..   
7b50: 20 20 20 20 20 20 20 64 62 2e 53 61 76 65 43 68         db.SaveCh
7b60: 61 6e 67 65 73 28 29 3b 0d 0a 0d 0a 20 20 20 20  anges();....    
7b70: 20 20 20 20 20 20 64 62 2e 44 65 6c 65 74 65 4f        db.DeleteO
7b80: 62 6a 65 63 74 28 63 29 3b 0d 0a 20 20 20 20 20  bject(c);..     
7b90: 20 20 20 20 20 64 62 2e 53 61 76 65 43 68 61 6e       db.SaveChan
7ba0: 67 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  ges();..        
7bb0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  }....        {..
7bc0: 20 20 20 20 20 20 20 20 20 20 43 75 73 74 6f 6d            Custom
7bd0: 65 72 73 20 63 75 73 74 20 3d 20 6e 65 77 20 43  ers cust = new C
7be0: 75 73 74 6f 6d 65 72 73 28 29 3b 0d 0a 20 20 20  ustomers();..   
7bf0: 20 20 20 20 20 20 20 63 75 73 74 2e 43 75 73 74         cust.Cust
7c00: 6f 6d 65 72 49 44 20 3d 20 22 4d 54 4d 54 4d 22  omerID = "MTMTM"
7c10: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63 75 73  ;..          cus
7c20: 74 2e 43 6f 6e 74 61 63 74 4e 61 6d 65 20 3d 20  t.ContactName = 
7c30: 22 4d 79 20 4e 61 6d 65 22 3b 0d 0a 20 20 20 20  "My Name";..    
7c40: 20 20 20 20 20 20 63 75 73 74 2e 43 6f 6d 70 61        cust.Compa
7c50: 6e 79 4e 61 6d 65 20 3d 20 22 53 51 4c 69 74 65  nyName = "SQLite
7c60: 20 43 6f 6d 70 61 6e 79 22 3b 0d 0a 20 20 20 20   Company";..    
7c70: 20 20 20 20 20 20 63 75 73 74 2e 43 6f 75 6e 74        cust.Count
7c80: 72 79 20 3d 20 22 4e 65 74 68 65 72 6c 61 6e 64  ry = "Netherland
7c90: 73 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 63  s";..          c
7ca0: 75 73 74 2e 43 69 74 79 20 3d 20 22 41 6d 73 74  ust.City = "Amst
7cb0: 65 72 64 61 6d 22 3b 0d 0a 20 20 20 20 20 20 20  erdam";..       
7cc0: 20 20 20 63 75 73 74 2e 50 68 6f 6e 65 20 3d 20     cust.Phone = 
7cd0: 22 30 31 32 33 34 35 36 37 37 22 3b 0d 0a 20 20  "012345677";..  
7ce0: 20 20 20 20 20 20 20 20 64 62 2e 41 64 64 54 6f          db.AddTo
7cf0: 43 75 73 74 6f 6d 65 72 73 28 63 75 73 74 29 3b  Customers(cust);
7d00: 0d 0a 20 20 20 20 20 20 20 20 20 20 64 62 2e 53  ..          db.S
7d10: 61 76 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a 0d  aveChanges();...
7d20: 0a 20 20 20 20 20 20 20 20 20 20 64 62 2e 44 65  .          db.De
7d30: 6c 65 74 65 4f 62 6a 65 63 74 28 63 75 73 74 29  leteObject(cust)
7d40: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 64 62 2e  ;..          db.
7d50: 53 61 76 65 43 68 61 6e 67 65 73 28 29 3b 0d 0a  SaveChanges();..
7d60: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
7d70: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7d80: 20 20 76 61 72 20 71 75 65 72 79 20 3d 20 64 62    var query = db
7d90: 2e 43 75 73 74 6f 6d 65 72 73 2e 57 68 65 72 65  .Customers.Where
7da0: 28 63 75 73 74 20 3d 3e 20 63 75 73 74 2e 43 6f  (cust => cust.Co
7db0: 75 6e 74 72 79 20 3d 3d 20 22 44 65 6e 6d 61 72  untry == "Denmar
7dc0: 6b 22 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  k")..           
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
7de0: 53 65 6c 65 63 74 4d 61 6e 79 28 63 75 73 74 20  SelectMany(cust 
7df0: 3d 3e 20 63 75 73 74 2e 4f 72 64 65 72 73 2e 57  => cust.Orders.W
7e00: 68 65 72 65 28 6f 20 3d 3e 20 6f 2e 46 72 65 69  here(o => o.Frei
7e10: 67 68 74 20 3e 20 35 29 29 0d 0a 20 20 20 20 20  ght > 5))..     
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e30: 20 20 20 20 20 2e 4f 72 64 65 72 42 79 28 6f 20       .OrderBy(o 
7e40: 3d 3e 20 6f 2e 43 75 73 74 6f 6d 65 72 73 2e 43  => o.Customers.C
7e50: 75 73 74 6f 6d 65 72 49 44 29 3b 0d 0a 0d 0a 20  ustomerID);.... 
7e60: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
7e70: 20 28 4f 72 64 65 72 73 20 63 20 69 6e 20 71 75   (Orders c in qu
7e80: 65 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ery)..          
7e90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  {..            C
7ea0: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
7eb0: 28 63 2e 46 72 65 69 67 68 74 29 3b 0d 0a 20 20  (c.Freight);..  
7ec0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7ed0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7ee0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 76 61 72  {..          var
7ef0: 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20 63 20   query = from c 
7f00: 69 6e 20 64 62 2e 43 75 73 74 6f 6d 65 72 73 0d  in db.Customers.
7f10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f20: 20 20 20 20 20 20 20 77 68 65 72 65 20 63 2e 4f         where c.O
7f30: 72 64 65 72 73 2e 41 6e 79 28 6f 20 3d 3e 20 6f  rders.Any(o => o
7f40: 2e 4f 72 64 65 72 44 61 74 65 2e 48 61 73 56 61  .OrderDate.HasVa
7f50: 6c 75 65 20 3d 3d 20 74 72 75 65 20 26 26 20 6f  lue == true && o
7f60: 2e 4f 72 64 65 72 44 61 74 65 2e 56 61 6c 75 65  .OrderDate.Value
7f70: 2e 59 65 61 72 20 3d 3d 20 31 39 39 37 29 0d 0a  .Year == 1997)..
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 6f 72 64 65 72 62 79 20 63 2e        orderby c.
7fa0: 43 75 73 74 6f 6d 65 72 49 44 0d 0a 20 20 20 20  CustomerID..    
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 73 65 6c 65 63 74 20 63 3b 0d 0a 0d 0a 20    select c;.... 
7fd0: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
7fe0: 20 28 43 75 73 74 6f 6d 65 72 73 20 63 20 69 6e   (Customers c in
7ff0: 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20   query)..       
8000: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8010: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c    Console.WriteL
8020: 69 6e 65 28 63 2e 43 6f 6d 70 61 6e 79 4e 61 6d  ine(c.CompanyNam
8030: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  e);..          }
8040: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
8050: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8060: 20 20 20 20 73 74 72 69 6e 67 20 65 6e 74 69 74      string entit
8070: 79 53 51 4c 20 3d 20 22 53 45 4c 45 43 54 20 56  ySQL = "SELECT V
8080: 41 4c 55 45 20 6f 20 46 52 4f 4d 20 4f 72 64 65  ALUE o FROM Orde
8090: 72 73 20 41 53 20 6f 20 57 48 45 52 45 20 6f 2e  rs AS o WHERE o.
80a0: 43 75 73 74 6f 6d 65 72 73 2e 43 6f 75 6e 74 72  Customers.Countr
80b0: 79 20 3c 3e 20 27 55 4b 27 20 41 4e 44 20 6f 2e  y <> 'UK' AND o.
80c0: 43 75 73 74 6f 6d 65 72 73 2e 43 6f 75 6e 74 72  Customers.Countr
80d0: 79 20 3c 3e 20 27 4d 65 78 69 63 6f 27 20 41 4e  y <> 'Mexico' AN
80e0: 44 20 59 65 61 72 28 6f 2e 4f 72 64 65 72 44 61  D Year(o.OrderDa
80f0: 74 65 29 20 3d 20 31 39 39 37 20 4f 52 44 45 52  te) = 1997 ORDER
8100: 20 42 59 20 6f 2e 4f 72 64 65 72 49 44 3b 22 3b   BY o.OrderID;";
8110: 0d 0a 20 20 20 20 20 20 20 20 20 20 4f 62 6a 65  ..          Obje
8120: 63 74 51 75 65 72 79 3c 4f 72 64 65 72 73 3e 20  ctQuery<Orders> 
8130: 71 75 65 72 79 20 3d 20 64 62 2e 43 72 65 61 74  query = db.Creat
8140: 65 51 75 65 72 79 3c 4f 72 64 65 72 73 3e 28 65  eQuery<Orders>(e
8150: 6e 74 69 74 79 53 51 4c 29 3b 0d 0a 0d 0a 20 20  ntitySQL);....  
8160: 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
8170: 28 4f 72 64 65 72 73 20 6f 20 69 6e 20 71 75 65  (Orders o in que
8180: 72 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  ry)..          {
8190: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ..            Co
81a0: 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65 28  nsole.WriteLine(
81b0: 6f 2e 53 68 69 70 50 6f 73 74 61 6c 43 6f 64 65  o.ShipPostalCode
81c0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d 0d  );..          }.
81d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
81e0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
81f0: 20 20 20 73 74 72 69 6e 67 20 65 6e 74 69 74 79     string entity
8200: 53 51 4c 20 3d 20 22 53 45 4c 45 43 54 20 56 41  SQL = "SELECT VA
8210: 4c 55 45 20 6f 20 46 52 4f 4d 20 4f 72 64 65 72  LUE o FROM Order
8220: 73 20 41 53 20 6f 20 57 48 45 52 45 20 4e 65 77  s AS o WHERE New
8230: 47 75 69 64 28 29 20 3c 3e 20 4e 65 77 47 75 69  Guid() <> NewGui
8240: 64 28 29 20 4f 52 44 45 52 20 42 59 20 6f 2e 4f  d() ORDER BY o.O
8250: 72 64 65 72 49 44 3b 22 3b 0d 0a 20 20 20 20 20  rderID;";..     
8260: 20 20 20 20 20 4f 62 6a 65 63 74 51 75 65 72 79       ObjectQuery
8270: 3c 4f 72 64 65 72 73 3e 20 71 75 65 72 79 20 3d  <Orders> query =
8280: 20 64 62 2e 43 72 65 61 74 65 51 75 65 72 79 3c   db.CreateQuery<
8290: 4f 72 64 65 72 73 3e 28 65 6e 74 69 74 79 53 51  Orders>(entitySQ
82a0: 4c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  L);....         
82b0: 20 66 6f 72 65 61 63 68 20 28 4f 72 64 65 72 73   foreach (Orders
82c0: 20 6f 20 69 6e 20 71 75 65 72 79 29 0d 0a 20 20   o in query)..  
82d0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
82e0: 20 20 20 20 20 20 20 43 6f 6e 73 6f 6c 65 2e 57         Console.W
82f0: 72 69 74 65 4c 69 6e 65 28 6f 2e 53 68 69 70 50  riteLine(o.ShipP
8300: 6f 73 74 61 6c 43 6f 64 65 29 3b 0d 0a 20 20 20  ostalCode);..   
8310: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
8320: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
8330: 2f 20 54 68 69 73 20 71 75 65 72 79 20 72 65 71  / This query req
8340: 75 69 72 65 73 20 53 51 4c 69 74 65 20 33 2e 36  uires SQLite 3.6
8350: 2e 32 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 63  .2 to function c
8360: 6f 72 72 65 63 74 6c 79 0d 0a 20 20 20 20 20 20  orrectly..      
8370: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 76    {..          v
8380: 61 72 20 71 75 65 72 79 20 3d 20 66 72 6f 6d 20  ar query = from 
8390: 70 20 69 6e 20 64 62 2e 50 72 6f 64 75 63 74 73  p in db.Products
83a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
83b0: 20 20 20 20 20 20 20 20 77 68 65 72 65 20 70 2e          where p.
83c0: 4f 72 64 65 72 44 65 74 61 69 6c 73 2e 43 6f 75  OrderDetails.Cou
83d0: 6e 74 28 6f 64 20 3d 3e 20 6f 64 2e 4f 72 64 65  nt(od => od.Orde
83e0: 72 73 2e 43 75 73 74 6f 6d 65 72 73 2e 43 6f 75  rs.Customers.Cou
83f0: 6e 74 72 79 20 3d 3d 20 70 2e 53 75 70 70 6c 69  ntry == p.Suppli
8400: 65 72 73 2e 43 6f 75 6e 74 72 79 29 20 3e 20 32  ers.Country) > 2
8410: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8420: 20 20 20 20 20 20 20 20 6f 72 64 65 72 62 79 20          orderby 
8430: 70 2e 50 72 6f 64 75 63 74 49 44 0d 0a 20 20 20  p.ProductID..   
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 73 65 6c 65 63 74 20 70 3b 0d 0a 0d 0a     select p;....
8460: 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
8470: 68 20 28 50 72 6f 64 75 63 74 73 20 70 20 69 6e  h (Products p in
8480: 20 71 75 65 72 79 29 0d 0a 20 20 20 20 20 20 20   query)..       
8490: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
84a0: 20 20 43 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c    Console.WriteL
84b0: 69 6e 65 28 70 2e 50 72 6f 64 75 63 74 4e 61 6d  ine(p.ProductNam
84c0: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 7d  e);..          }
84d0: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
84e0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f     }....      //
84f0: 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a  ..      // NOTE:
8500: 20 28 4a 4a 4d 29 20 52 65 6d 6f 76 65 64 20 6f   (JJM) Removed o
8510: 6e 20 32 30 31 31 2f 30 37 2f 30 36 2c 20 6d 61  n 2011/07/06, ma
8520: 6b 65 73 20 69 74 20 68 61 72 64 65 72 20 74 6f  kes it harder to
8530: 20 72 75 6e 20 74 68 69 73 20 45 58 45 20 76 69   run this EXE vi
8540: 61 0d 0a 20 20 20 20 20 20 2f 2f 20 20 20 20 20  a..      //     
8550: 20 20 74 68 65 20 6e 65 77 20 75 6e 69 74 20 74    the new unit t
8560: 65 73 74 20 73 75 69 74 65 2e 0d 0a 20 20 20 20  est suite...    
8570: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 2f 2f 20 43    //..      // C
8580: 6f 6e 73 6f 6c 65 2e 52 65 61 64 4b 65 79 28 29  onsole.ReadKey()
8590: 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ;....      retur
85a0: 6e 20 30 3b 0d 0a 20 20 20 20 7d 0d 0a 20 20 7d  n 0;..    }..  }
85b0: 0d 0a 7d 0d 0a                                   ..}..