System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 195273a8596ec8365308b0ade95d25085aceb988:


0000: 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  //--------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 0d 0a 2f 2f 20 3c 63 6f 70  -------..// <cop
0050: 79 72 69 67 68 74 20 66 69 6c 65 3d 22 44 6d 6c  yright file="Dml
0060: 53 71 6c 47 65 6e 65 72 61 74 6f 72 2e 63 73 22  SqlGenerator.cs"
0070: 20 63 6f 6d 70 61 6e 79 3d 22 4d 69 63 72 6f 73   company="Micros
0080: 6f 66 74 22 3e 0d 0a 2f 2f 20 20 20 20 20 20 50  oft">..//      P
0090: 6f 72 74 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ortions of this 
00a0: 66 69 6c 65 20 63 6f 70 79 72 69 67 68 74 20 28  file copyright (
00b0: 63 29 20 4d 69 63 72 6f 73 6f 66 74 20 43 6f 72  c) Microsoft Cor
00c0: 70 6f 72 61 74 69 6f 6e 0d 0a 2f 2f 20 20 20 20  poration..//    
00d0: 20 20 61 6e 64 20 61 72 65 20 72 65 6c 65 61 73    and are releas
00e0: 65 64 20 75 6e 64 65 72 20 74 68 65 20 4d 69 63  ed under the Mic
00f0: 72 6f 73 6f 66 74 20 50 75 6c 69 63 20 4c 69 63  rosoft Pulic Lic
0100: 65 6e 73 65 2e 20 20 53 65 65 0d 0a 2f 2f 20 20  ense.  See..//  
0110: 20 20 20 20 68 74 74 70 3a 2f 2f 61 72 63 68 69      http://archi
0120: 76 65 2e 6d 73 64 6e 2e 6d 69 63 72 6f 73 6f 66  ve.msdn.microsof
0130: 74 2e 63 6f 6d 2f 45 46 53 61 6d 70 6c 65 50 72  t.com/EFSamplePr
0140: 6f 76 69 64 65 72 2f 50 72 6f 6a 65 63 74 2f 4c  ovider/Project/L
0150: 69 63 65 6e 73 65 2e 61 73 70 78 0d 0a 2f 2f 20  icense.aspx..// 
0160: 20 20 20 20 20 6f 72 20 4c 69 63 65 6e 73 65 2e       or License.
0170: 74 78 74 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  txt for details.
0180: 0d 0a 2f 2f 20 20 20 20 20 20 41 6c 6c 20 72 69  ..//      All ri
0190: 67 68 74 73 20 72 65 73 65 72 76 65 64 2e 0d 0a  ghts reserved...
01a0: 2f 2f 20 3c 2f 63 6f 70 79 72 69 67 68 74 3e 0d  // </copyright>.
01b0: 0a 2f 2f 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .//-------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 0d 0a 23 69 66 20  --------....#if 
0200: 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45  USE_ENTITY_FRAME
0210: 57 4f 52 4b 5f 36 0d 0a 6e 61 6d 65 73 70 61 63  WORK_6..namespac
0220: 65 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51  e System.Data.SQ
0230: 4c 69 74 65 2e 45 46 36 0d 0a 23 65 6c 73 65 0d  Lite.EF6..#else.
0240: 0a 6e 61 6d 65 73 70 61 63 65 20 53 79 73 74 65  .namespace Syste
0250: 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 4c 69  m.Data.SQLite.Li
0260: 6e 71 0d 0a 23 65 6e 64 69 66 0d 0a 7b 0d 0a 20  nq..#endif..{.. 
0270: 20 75 73 69 6e 67 20 53 79 73 74 65 6d 3b 0d 0a   using System;..
0280: 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 43    using System.C
0290: 6f 6c 6c 65 63 74 69 6f 6e 73 2e 47 65 6e 65 72  ollections.Gener
02a0: 69 63 3b 0d 0a 20 20 75 73 69 6e 67 20 53 79 73  ic;..  using Sys
02b0: 74 65 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 3b  tem.Diagnostics;
02c0: 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d  ..  using System
02d0: 2e 47 6c 6f 62 61 6c 69 7a 61 74 69 6f 6e 3b 0d  .Globalization;.
02e0: 0a 20 20 75 73 69 6e 67 20 53 79 73 74 65 6d 2e  .  using System.
02f0: 54 65 78 74 3b 0d 0a 20 20 75 73 69 6e 67 20 53  Text;..  using S
0300: 79 73 74 65 6d 2e 44 61 74 61 3b 0d 0a 20 20 75  ystem.Data;..  u
0310: 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61  sing System.Data
0320: 2e 43 6f 6d 6d 6f 6e 3b 0d 0a 0d 0a 23 69 66 20  .Common;....#if 
0330: 55 53 45 5f 45 4e 54 49 54 59 5f 46 52 41 4d 45  USE_ENTITY_FRAME
0340: 57 4f 52 4b 5f 36 0d 0a 20 20 75 73 69 6e 67 20  WORK_6..  using 
0350: 53 79 73 74 65 6d 2e 44 61 74 61 2e 45 6e 74 69  System.Data.Enti
0360: 74 79 2e 43 6f 72 65 2e 4d 65 74 61 64 61 74 61  ty.Core.Metadata
0370: 2e 45 64 6d 3b 0d 0a 20 20 75 73 69 6e 67 20 53  .Edm;..  using S
0380: 79 73 74 65 6d 2e 44 61 74 61 2e 45 6e 74 69 74  ystem.Data.Entit
0390: 79 2e 43 6f 72 65 2e 43 6f 6d 6d 6f 6e 2e 43 6f  y.Core.Common.Co
03a0: 6d 6d 61 6e 64 54 72 65 65 73 3b 0d 0a 23 65 6c  mmandTrees;..#el
03b0: 73 65 0d 0a 20 20 75 73 69 6e 67 20 53 79 73 74  se..  using Syst
03c0: 65 6d 2e 44 61 74 61 2e 4d 65 74 61 64 61 74 61  em.Data.Metadata
03d0: 2e 45 64 6d 3b 0d 0a 20 20 75 73 69 6e 67 20 53  .Edm;..  using S
03e0: 79 73 74 65 6d 2e 44 61 74 61 2e 43 6f 6d 6d 6f  ystem.Data.Commo
03f0: 6e 2e 43 6f 6d 6d 61 6e 64 54 72 65 65 73 3b 0d  n.CommandTrees;.
0400: 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20 20 2f  .#endif....    /
0410: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
0420: 2f 2f 2f 20 43 6c 61 73 73 20 67 65 6e 65 72 61  /// Class genera
0430: 74 69 6e 67 20 53 51 4c 20 66 6f 72 20 61 20 44  ting SQL for a D
0440: 4d 4c 20 63 6f 6d 6d 61 6e 64 20 74 72 65 65 2e  ML command tree.
0450: 0d 0a 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72  ..  /// </summar
0460: 79 3e 0d 0a 20 20 69 6e 74 65 72 6e 61 6c 20 73  y>..  internal s
0470: 74 61 74 69 63 20 63 6c 61 73 73 20 44 6d 6c 53  tatic class DmlS
0480: 71 6c 47 65 6e 65 72 61 74 6f 72 0d 0a 20 20 7b  qlGenerator..  {
0490: 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
04a0: 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 69 6e  atic readonly in
04b0: 74 20 73 5f 63 6f 6d 6d 61 6e 64 54 65 78 74 42  t s_commandTextB
04c0: 75 69 6c 64 65 72 49 6e 69 74 69 61 6c 43 61 70  uilderInitialCap
04d0: 61 63 69 74 79 20 3d 20 32 35 36 3b 0d 0a 0d 0a  acity = 256;....
04e0: 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61      internal sta
04f0: 74 69 63 20 73 74 72 69 6e 67 20 47 65 6e 65 72  tic string Gener
0500: 61 74 65 55 70 64 61 74 65 53 71 6c 28 44 62 55  ateUpdateSql(DbU
0510: 70 64 61 74 65 43 6f 6d 6d 61 6e 64 54 72 65 65  pdateCommandTree
0520: 20 74 72 65 65 2c 20 6f 75 74 20 4c 69 73 74 3c   tree, out List<
0530: 44 62 50 61 72 61 6d 65 74 65 72 3e 20 70 61 72  DbParameter> par
0540: 61 6d 65 74 65 72 73 29 0d 0a 20 20 20 20 7b 0d  ameters)..    {.
0550: 0a 20 20 20 20 20 20 53 74 72 69 6e 67 42 75 69  .      StringBui
0560: 6c 64 65 72 20 63 6f 6d 6d 61 6e 64 54 65 78 74  lder commandText
0570: 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69   = new StringBui
0580: 6c 64 65 72 28 73 5f 63 6f 6d 6d 61 6e 64 54 65  lder(s_commandTe
0590: 78 74 42 75 69 6c 64 65 72 49 6e 69 74 69 61 6c  xtBuilderInitial
05a0: 43 61 70 61 63 69 74 79 29 3b 0d 0a 20 20 20 20  Capacity);..    
05b0: 20 20 45 78 70 72 65 73 73 69 6f 6e 54 72 61 6e    ExpressionTran
05c0: 73 6c 61 74 6f 72 20 74 72 61 6e 73 6c 61 74 6f  slator translato
05d0: 72 20 3d 20 6e 65 77 20 45 78 70 72 65 73 73 69  r = new Expressi
05e0: 6f 6e 54 72 61 6e 73 6c 61 74 6f 72 28 63 6f 6d  onTranslator(com
05f0: 6d 61 6e 64 54 65 78 74 2c 20 74 72 65 65 2c 20  mandText, tree, 
0600: 6e 75 6c 6c 20 21 3d 20 74 72 65 65 2e 52 65 74  null != tree.Ret
0610: 75 72 6e 69 6e 67 2c 20 22 55 70 64 61 74 65 46  urning, "UpdateF
0620: 75 6e 63 74 69 6f 6e 22 29 3b 0d 0a 0d 0a 20 20  unction");....  
0630: 20 20 20 20 2f 2f 20 75 70 64 61 74 65 20 5b 73      // update [s
0640: 63 68 65 6d 61 4e 61 6d 65 5d 2e 5b 74 61 62 6c  chemaName].[tabl
0650: 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 63 6f  eName]..      co
0660: 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64  mmandText.Append
0670: 28 22 55 50 44 41 54 45 20 22 29 3b 0d 0a 20 20  ("UPDATE ");..  
0680: 20 20 20 20 74 72 65 65 2e 54 61 72 67 65 74 2e      tree.Target.
0690: 45 78 70 72 65 73 73 69 6f 6e 2e 41 63 63 65 70  Expression.Accep
06a0: 74 28 74 72 61 6e 73 6c 61 74 6f 72 29 3b 0d 0a  t(translator);..
06b0: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78        commandTex
06c0: 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 29 3b 0d  t.AppendLine();.
06d0: 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 73 65 74 20  ...      // set 
06e0: 63 31 20 3d 20 2e 2e 2e 2c 20 63 32 20 3d 20 2e  c1 = ..., c2 = .
06f0: 2e 2e 2c 20 2e 2e 2e 0d 0a 20 20 20 20 20 20 62  .., .....      b
0700: 6f 6f 6c 20 66 69 72 73 74 20 3d 20 74 72 75 65  ool first = true
0710: 3b 0d 0a 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64  ;..      command
0720: 54 65 78 74 2e 41 70 70 65 6e 64 28 22 53 45 54  Text.Append("SET
0730: 20 22 29 3b 0d 0a 20 20 20 20 20 20 66 6f 72 65   ");..      fore
0740: 61 63 68 20 28 44 62 53 65 74 43 6c 61 75 73 65  ach (DbSetClause
0750: 20 73 65 74 43 6c 61 75 73 65 20 69 6e 20 74 72   setClause in tr
0760: 65 65 2e 53 65 74 43 6c 61 75 73 65 73 29 0d 0a  ee.SetClauses)..
0770: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0780: 20 69 66 20 28 66 69 72 73 74 29 20 7b 20 66 69   if (first) { fi
0790: 72 73 74 20 3d 20 66 61 6c 73 65 3b 20 7d 0d 0a  rst = false; }..
07a0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 20 63          else { c
07b0: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
07c0: 64 28 22 2c 20 22 29 3b 20 7d 0d 0a 20 20 20 20  d(", "); }..    
07d0: 20 20 20 20 73 65 74 43 6c 61 75 73 65 2e 50 72      setClause.Pr
07e0: 6f 70 65 72 74 79 2e 41 63 63 65 70 74 28 74 72  operty.Accept(tr
07f0: 61 6e 73 6c 61 74 6f 72 29 3b 0d 0a 20 20 20 20  anslator);..    
0800: 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e      commandText.
0810: 41 70 70 65 6e 64 28 22 20 3d 20 22 29 3b 0d 0a  Append(" = ");..
0820: 20 20 20 20 20 20 20 20 73 65 74 43 6c 61 75 73          setClaus
0830: 65 2e 56 61 6c 75 65 2e 41 63 63 65 70 74 28 74  e.Value.Accept(t
0840: 72 61 6e 73 6c 61 74 6f 72 29 3b 0d 0a 20 20 20  ranslator);..   
0850: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 69 66     }....      if
0860: 20 28 66 69 72 73 74 29 0d 0a 20 20 20 20 20 20   (first)..      
0870: 7b 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66  {..        // If
0880: 20 66 69 72 73 74 20 69 73 20 73 74 69 6c 6c 20   first is still 
0890: 74 72 75 65 2c 20 69 74 20 69 6e 64 69 63 61 74  true, it indicat
08a0: 65 73 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  es there were no
08b0: 20 73 65 74 0d 0a 20 20 20 20 20 20 20 20 2f 2f   set..        //
08c0: 20 63 6c 61 75 73 65 73 2e 20 49 6e 74 72 6f 64   clauses. Introd
08d0: 75 63 65 20 61 20 66 61 6b 65 20 73 65 74 20 63  uce a fake set c
08e0: 6c 61 75 73 65 20 73 6f 20 74 68 61 74 3a 0d 0a  lause so that:..
08f0: 20 20 20 20 20 20 20 20 2f 2f 20 2d 20 77 65 20          // - we 
0900: 61 63 71 75 69 72 65 20 74 68 65 20 61 70 70 72  acquire the appr
0910: 6f 70 72 69 61 74 65 20 6c 6f 63 6b 73 0d 0a 20  opriate locks.. 
0920: 20 20 20 20 20 20 20 2f 2f 20 2d 20 73 65 72 76         // - serv
0930: 65 72 2d 67 65 6e 20 63 6f 6c 75 6d 6e 73 20 28  er-gen columns (
0940: 65 2e 67 2e 20 74 69 6d 65 73 74 61 6d 70 29 20  e.g. timestamp) 
0950: 67 65 74 20 72 65 63 6f 6d 70 75 74 65 64 0d 0a  get recomputed..
0960: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
0970: 20 20 20 20 2f 2f 20 57 65 20 75 73 65 20 74 68      // We use th
0980: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74  e following patt
0990: 65 72 6e 3a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ern:..        //
09a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 75 70  ..        //  up
09b0: 64 61 74 65 20 46 6f 6f 0d 0a 20 20 20 20 20 20  date Foo..      
09c0: 20 20 2f 2f 20 20 73 65 74 20 40 69 20 3d 20 30    //  set @i = 0
09d0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 77 68  ..        //  wh
09e0: 65 72 65 20 2e 2e 2e 0d 0a 20 20 20 20 20 20 20  ere .....       
09f0: 20 44 62 50 61 72 61 6d 65 74 65 72 20 70 61 72   DbParameter par
0a00: 61 6d 65 74 65 72 20 3d 20 74 72 61 6e 73 6c 61  ameter = transla
0a10: 74 6f 72 2e 43 72 65 61 74 65 50 61 72 61 6d 65  tor.CreateParame
0a20: 74 65 72 28 64 65 66 61 75 6c 74 28 49 6e 74 33  ter(default(Int3
0a30: 32 29 2c 20 44 62 54 79 70 65 2e 49 6e 74 33 32  2), DbType.Int32
0a40: 29 3b 0d 0a 20 20 20 20 20 20 20 20 63 6f 6d 6d  );..        comm
0a50: 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 28 70  andText.Append(p
0a60: 61 72 61 6d 65 74 65 72 2e 50 61 72 61 6d 65 74  arameter.Paramet
0a70: 65 72 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20  erName);..      
0a80: 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70    commandText.Ap
0a90: 70 65 6e 64 28 22 20 3d 20 30 22 29 3b 0d 0a 20  pend(" = 0");.. 
0aa0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 63 6f       }..      co
0ab0: 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64  mmandText.Append
0ac0: 4c 69 6e 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Line();....     
0ad0: 20 2f 2f 20 77 68 65 72 65 20 63 31 20 3d 20 2e   // where c1 = .
0ae0: 2e 2e 2c 20 63 32 20 3d 20 2e 2e 2e 0d 0a 20 20  .., c2 = .....  
0af0: 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e      commandText.
0b00: 41 70 70 65 6e 64 28 22 57 48 45 52 45 20 22 29  Append("WHERE ")
0b10: 3b 0d 0a 20 20 20 20 20 20 74 72 65 65 2e 50 72  ;..      tree.Pr
0b20: 65 64 69 63 61 74 65 2e 41 63 63 65 70 74 28 74  edicate.Accept(t
0b30: 72 61 6e 73 6c 61 74 6f 72 29 3b 0d 0a 20 20 20  ranslator);..   
0b40: 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41     commandText.A
0b50: 70 70 65 6e 64 4c 69 6e 65 28 22 3b 22 29 3b 0d  ppendLine(";");.
0b60: 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 67 65 6e 65  ...      // gene
0b70: 72 61 74 65 20 72 65 74 75 72 6e 69 6e 67 20 73  rate returning s
0b80: 71 6c 0d 0a 20 20 20 20 20 20 47 65 6e 65 72 61  ql..      Genera
0b90: 74 65 52 65 74 75 72 6e 69 6e 67 53 71 6c 28 63  teReturningSql(c
0ba0: 6f 6d 6d 61 6e 64 54 65 78 74 2c 20 74 72 65 65  ommandText, tree
0bb0: 2c 20 74 72 61 6e 73 6c 61 74 6f 72 2c 20 74 72  , translator, tr
0bc0: 65 65 2e 52 65 74 75 72 6e 69 6e 67 2c 20 66 61  ee.Returning, fa
0bd0: 6c 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 70  lse);....      p
0be0: 61 72 61 6d 65 74 65 72 73 20 3d 20 74 72 61 6e  arameters = tran
0bf0: 73 6c 61 74 6f 72 2e 50 61 72 61 6d 65 74 65 72  slator.Parameter
0c00: 73 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  s;..      return
0c10: 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 54 6f 53   commandText.ToS
0c20: 74 72 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d 0d  tring();..    }.
0c30: 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20  ...    internal 
0c40: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65  static string Ge
0c50: 6e 65 72 61 74 65 44 65 6c 65 74 65 53 71 6c 28  nerateDeleteSql(
0c60: 44 62 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 54  DbDeleteCommandT
0c70: 72 65 65 20 74 72 65 65 2c 20 6f 75 74 20 4c 69  ree tree, out Li
0c80: 73 74 3c 44 62 50 61 72 61 6d 65 74 65 72 3e 20  st<DbParameter> 
0c90: 70 61 72 61 6d 65 74 65 72 73 29 0d 0a 20 20 20  parameters)..   
0ca0: 20 7b 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67   {..      String
0cb0: 42 75 69 6c 64 65 72 20 63 6f 6d 6d 61 6e 64 54  Builder commandT
0cc0: 65 78 74 20 3d 20 6e 65 77 20 53 74 72 69 6e 67  ext = new String
0cd0: 42 75 69 6c 64 65 72 28 73 5f 63 6f 6d 6d 61 6e  Builder(s_comman
0ce0: 64 54 65 78 74 42 75 69 6c 64 65 72 49 6e 69 74  dTextBuilderInit
0cf0: 69 61 6c 43 61 70 61 63 69 74 79 29 3b 0d 0a 20  ialCapacity);.. 
0d00: 20 20 20 20 20 45 78 70 72 65 73 73 69 6f 6e 54       ExpressionT
0d10: 72 61 6e 73 6c 61 74 6f 72 20 74 72 61 6e 73 6c  ranslator transl
0d20: 61 74 6f 72 20 3d 20 6e 65 77 20 45 78 70 72 65  ator = new Expre
0d30: 73 73 69 6f 6e 54 72 61 6e 73 6c 61 74 6f 72 28  ssionTranslator(
0d40: 63 6f 6d 6d 61 6e 64 54 65 78 74 2c 20 74 72 65  commandText, tre
0d50: 65 2c 20 66 61 6c 73 65 2c 20 22 44 65 6c 65 74  e, false, "Delet
0d60: 65 46 75 6e 63 74 69 6f 6e 22 29 3b 0d 0a 0d 0a  eFunction");....
0d70: 20 20 20 20 20 20 2f 2f 20 64 65 6c 65 74 65 20        // delete 
0d80: 5b 73 63 68 65 6d 61 4e 61 6d 65 5d 2e 5b 74 61  [schemaName].[ta
0d90: 62 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20  bleName]..      
0da0: 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65  commandText.Appe
0db0: 6e 64 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  nd("DELETE FROM 
0dc0: 22 29 3b 0d 0a 20 20 20 20 20 20 74 72 65 65 2e  ");..      tree.
0dd0: 54 61 72 67 65 74 2e 45 78 70 72 65 73 73 69 6f  Target.Expressio
0de0: 6e 2e 41 63 63 65 70 74 28 74 72 61 6e 73 6c 61  n.Accept(transla
0df0: 74 6f 72 29 3b 0d 0a 20 20 20 20 20 20 63 6f 6d  tor);..      com
0e00: 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 4c  mandText.AppendL
0e10: 69 6e 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ine();....      
0e20: 2f 2f 20 77 68 65 72 65 20 63 31 20 3d 20 2e 2e  // where c1 = ..
0e30: 2e 20 41 4e 44 20 63 32 20 3d 20 2e 2e 2e 0d 0a  . AND c2 = .....
0e40: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78        commandTex
0e50: 74 2e 41 70 70 65 6e 64 28 22 57 48 45 52 45 20  t.Append("WHERE 
0e60: 22 29 3b 0d 0a 20 20 20 20 20 20 74 72 65 65 2e  ");..      tree.
0e70: 50 72 65 64 69 63 61 74 65 2e 41 63 63 65 70 74  Predicate.Accept
0e80: 28 74 72 61 6e 73 6c 61 74 6f 72 29 3b 0d 0a 0d  (translator);...
0e90: 0a 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72  .      parameter
0ea0: 73 20 3d 20 74 72 61 6e 73 6c 61 74 6f 72 2e 50  s = translator.P
0eb0: 61 72 61 6d 65 74 65 72 73 3b 0d 0a 0d 0a 20 20  arameters;....  
0ec0: 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e      commandText.
0ed0: 41 70 70 65 6e 64 4c 69 6e 65 28 22 3b 22 29 3b  AppendLine(";");
0ee0: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 63  ..      return c
0ef0: 6f 6d 6d 61 6e 64 54 65 78 74 2e 54 6f 53 74 72  ommandText.ToStr
0f00: 69 6e 67 28 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  ing();..    }...
0f10: 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 74  .    internal st
0f20: 61 74 69 63 20 73 74 72 69 6e 67 20 47 65 6e 65  atic string Gene
0f30: 72 61 74 65 49 6e 73 65 72 74 53 71 6c 28 44 62  rateInsertSql(Db
0f40: 49 6e 73 65 72 74 43 6f 6d 6d 61 6e 64 54 72 65  InsertCommandTre
0f50: 65 20 74 72 65 65 2c 20 6f 75 74 20 4c 69 73 74  e tree, out List
0f60: 3c 44 62 50 61 72 61 6d 65 74 65 72 3e 20 70 61  <DbParameter> pa
0f70: 72 61 6d 65 74 65 72 73 29 0d 0a 20 20 20 20 7b  rameters)..    {
0f80: 0d 0a 20 20 20 20 20 20 53 74 72 69 6e 67 42 75  ..      StringBu
0f90: 69 6c 64 65 72 20 63 6f 6d 6d 61 6e 64 54 65 78  ilder commandTex
0fa0: 74 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75  t = new StringBu
0fb0: 69 6c 64 65 72 28 73 5f 63 6f 6d 6d 61 6e 64 54  ilder(s_commandT
0fc0: 65 78 74 42 75 69 6c 64 65 72 49 6e 69 74 69 61  extBuilderInitia
0fd0: 6c 43 61 70 61 63 69 74 79 29 3b 0d 0a 20 20 20  lCapacity);..   
0fe0: 20 20 20 45 78 70 72 65 73 73 69 6f 6e 54 72 61     ExpressionTra
0ff0: 6e 73 6c 61 74 6f 72 20 74 72 61 6e 73 6c 61 74  nslator translat
1000: 6f 72 20 3d 20 6e 65 77 20 45 78 70 72 65 73 73  or = new Express
1010: 69 6f 6e 54 72 61 6e 73 6c 61 74 6f 72 28 63 6f  ionTranslator(co
1020: 6d 6d 61 6e 64 54 65 78 74 2c 20 74 72 65 65 2c  mmandText, tree,
1030: 20 6e 75 6c 6c 20 21 3d 20 74 72 65 65 2e 52 65   null != tree.Re
1040: 74 75 72 6e 69 6e 67 2c 20 22 49 6e 73 65 72 74  turning, "Insert
1050: 46 75 6e 63 74 69 6f 6e 22 29 3b 0d 0a 0d 0a 20  Function");.... 
1060: 20 20 20 20 20 2f 2f 20 69 6e 73 65 72 74 20 5b       // insert [
1070: 73 63 68 65 6d 61 4e 61 6d 65 5d 2e 5b 74 61 62  schemaName].[tab
1080: 6c 65 4e 61 6d 65 5d 0d 0a 20 20 20 20 20 20 63  leName]..      c
1090: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
10a0: 64 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  d("INSERT INTO "
10b0: 29 3b 0d 0a 20 20 20 20 20 20 74 72 65 65 2e 54  );..      tree.T
10c0: 61 72 67 65 74 2e 45 78 70 72 65 73 73 69 6f 6e  arget.Expression
10d0: 2e 41 63 63 65 70 74 28 74 72 61 6e 73 6c 61 74  .Accept(translat
10e0: 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 69 66  or);....      if
10f0: 20 28 74 72 65 65 2e 53 65 74 43 6c 61 75 73 65   (tree.SetClause
1100: 73 2e 43 6f 75 6e 74 20 3e 20 30 29 0d 0a 20 20  s.Count > 0)..  
1110: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 2f      {..        /
1120: 2f 20 28 63 31 2c 20 63 32 2c 20 63 33 2c 20 2e  / (c1, c2, c3, .
1130: 2e 2e 29 0d 0a 20 20 20 20 20 20 20 20 63 6f 6d  ..)..        com
1140: 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 28  mandText.Append(
1150: 22 28 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 62  "(");..        b
1160: 6f 6f 6c 20 66 69 72 73 74 20 3d 20 74 72 75 65  ool first = true
1170: 3b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61  ;..        forea
1180: 63 68 20 28 44 62 53 65 74 43 6c 61 75 73 65 20  ch (DbSetClause 
1190: 73 65 74 43 6c 61 75 73 65 20 69 6e 20 74 72 65  setClause in tre
11a0: 65 2e 53 65 74 43 6c 61 75 73 65 73 29 0d 0a 20  e.SetClauses).. 
11b0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
11c0: 20 20 20 20 69 66 20 28 66 69 72 73 74 29 20 7b      if (first) {
11d0: 20 66 69 72 73 74 20 3d 20 66 61 6c 73 65 3b 20   first = false; 
11e0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73  }..          els
11f0: 65 20 7b 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e  e { commandText.
1200: 41 70 70 65 6e 64 28 22 2c 20 22 29 3b 20 7d 0d  Append(", "); }.
1210: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 43 6c  .          setCl
1220: 61 75 73 65 2e 50 72 6f 70 65 72 74 79 2e 41 63  ause.Property.Ac
1230: 63 65 70 74 28 74 72 61 6e 73 6c 61 74 6f 72 29  cept(translator)
1240: 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
1250: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78        commandTex
1260: 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 22 29 22  t.AppendLine(")"
1270: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  );....        //
1280: 20 76 61 6c 75 65 73 20 63 31 2c 20 63 32 2c 20   values c1, c2, 
1290: 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20 66 69 72  .....        fir
12a0: 73 74 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  st = true;..    
12b0: 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e      commandText.
12c0: 41 70 70 65 6e 64 28 22 20 56 41 4c 55 45 53 20  Append(" VALUES 
12d0: 28 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 66 6f  (");..        fo
12e0: 72 65 61 63 68 20 28 44 62 53 65 74 43 6c 61 75  reach (DbSetClau
12f0: 73 65 20 73 65 74 43 6c 61 75 73 65 20 69 6e 20  se setClause in 
1300: 74 72 65 65 2e 53 65 74 43 6c 61 75 73 65 73 29  tree.SetClauses)
1310: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
1320: 20 20 20 20 20 20 20 69 66 20 28 66 69 72 73 74         if (first
1330: 29 20 7b 20 66 69 72 73 74 20 3d 20 66 61 6c 73  ) { first = fals
1340: 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
1350: 65 6c 73 65 20 7b 20 63 6f 6d 6d 61 6e 64 54 65  else { commandTe
1360: 78 74 2e 41 70 70 65 6e 64 28 22 2c 20 22 29 3b  xt.Append(", ");
1370: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 73 65   }..          se
1380: 74 43 6c 61 75 73 65 2e 56 61 6c 75 65 2e 41 63  tClause.Value.Ac
1390: 63 65 70 74 28 74 72 61 6e 73 6c 61 74 6f 72 29  cept(translator)
13a0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 74  ;....          t
13b0: 72 61 6e 73 6c 61 74 6f 72 2e 52 65 67 69 73 74  ranslator.Regist
13c0: 65 72 4d 65 6d 62 65 72 56 61 6c 75 65 28 73 65  erMemberValue(se
13d0: 74 43 6c 61 75 73 65 2e 50 72 6f 70 65 72 74 79  tClause.Property
13e0: 2c 20 73 65 74 43 6c 61 75 73 65 2e 56 61 6c 75  , setClause.Valu
13f0: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  e);..        }..
1400: 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54          commandT
1410: 65 78 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 22  ext.AppendLine("
1420: 29 3b 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  );");..      }..
1430: 20 20 20 20 20 20 65 6c 73 65 20 2f 2f 20 4e 6f        else // No
1440: 20 63 6f 6c 75 6d 6e 73 20 73 70 65 63 69 66 69   columns specifi
1450: 65 64 2e 20 20 49 6e 73 65 72 74 20 61 6e 20 65  ed.  Insert an e
1460: 6d 70 74 79 20 72 6f 77 20 63 6f 6e 74 61 69 6e  mpty row contain
1470: 69 6e 67 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ing default valu
1480: 65 73 20 62 79 20 69 6e 73 65 72 74 69 6e 67 20  es by inserting 
1490: 6e 75 6c 6c 20 69 6e 74 6f 20 74 68 65 20 72 6f  null into the ro
14a0: 77 69 64 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  wid..      {..  
14b0: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78        commandTex
14c0: 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 22 20 44  t.AppendLine(" D
14d0: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 22 29  EFAULT VALUES;")
14e0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
14f0: 20 20 20 20 2f 2f 20 67 65 6e 65 72 61 74 65 20      // generate 
1500: 72 65 74 75 72 6e 69 6e 67 20 73 71 6c 0d 0a 20  returning sql.. 
1510: 20 20 20 20 20 47 65 6e 65 72 61 74 65 52 65 74       GenerateRet
1520: 75 72 6e 69 6e 67 53 71 6c 28 63 6f 6d 6d 61 6e  urningSql(comman
1530: 64 54 65 78 74 2c 20 74 72 65 65 2c 20 74 72 61  dText, tree, tra
1540: 6e 73 6c 61 74 6f 72 2c 20 74 72 65 65 2e 52 65  nslator, tree.Re
1550: 74 75 72 6e 69 6e 67 2c 20 74 72 75 65 29 3b 0d  turning, true);.
1560: 0a 0d 0a 20 20 20 20 20 20 70 61 72 61 6d 65 74  ...      paramet
1570: 65 72 73 20 3d 20 74 72 61 6e 73 6c 61 74 6f 72  ers = translator
1580: 2e 50 61 72 61 6d 65 74 65 72 73 3b 0d 0a 20 20  .Parameters;..  
1590: 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6d 6d 61      return comma
15a0: 6e 64 54 65 78 74 2e 54 6f 53 74 72 69 6e 67 28  ndText.ToString(
15b0: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
15c0: 20 2f 2f 20 47 65 6e 65 72 61 74 65 73 20 54 2d   // Generates T-
15d0: 53 51 4c 20 64 65 73 63 72 69 62 69 6e 67 20 61  SQL describing a
15e0: 20 6d 65 6d 62 65 72 0d 0a 20 20 20 20 2f 2f 20   member..    // 
15f0: 52 65 71 75 69 72 65 73 3a 20 6d 65 6d 62 65 72  Requires: member
1600: 20 6d 75 73 74 20 62 65 6c 6f 6e 67 20 74 6f 20   must belong to 
1610: 61 6e 20 65 6e 74 69 74 79 20 74 79 70 65 20 28  an entity type (
1620: 61 20 73 61 66 65 20 72 65 71 75 69 72 65 6d 65  a safe requireme
1630: 6e 74 20 66 6f 72 20 44 4d 4c 0d 0a 20 20 20 20  nt for DML..    
1640: 2f 2f 20 53 51 4c 20 67 65 6e 2c 20 77 68 65 72  // SQL gen, wher
1650: 65 20 77 65 20 6f 6e 6c 79 20 61 63 63 65 73 73  e we only access
1660: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 29 0d   table columns).
1670: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
1680: 74 69 63 20 73 74 72 69 6e 67 20 47 65 6e 65 72  tic string Gener
1690: 61 74 65 4d 65 6d 62 65 72 54 53 71 6c 28 45 64  ateMemberTSql(Ed
16a0: 6d 4d 65 6d 62 65 72 20 6d 65 6d 62 65 72 29 0d  mMember member).
16b0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
16c0: 74 75 72 6e 20 53 71 6c 47 65 6e 65 72 61 74 6f  turn SqlGenerato
16d0: 72 2e 51 75 6f 74 65 49 64 65 6e 74 69 66 69 65  r.QuoteIdentifie
16e0: 72 28 6d 65 6d 62 65 72 2e 4e 61 6d 65 29 3b 0d  r(member.Name);.
16f0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
1700: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
1710: 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68 6f 64   /// This method
1720: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
1730: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 73 70  ermine if the sp
1740: 65 63 69 66 69 65 64 20 74 61 62 6c 65 20 68 61  ecified table ha
1750: 73 20 61 6e 20 69 6e 74 65 67 65 72 0d 0a 20 20  s an integer..  
1760: 20 20 2f 2f 2f 20 70 72 69 6d 61 72 79 20 6b 65    /// primary ke
1770: 79 20 28 69 2e 65 2e 20 22 72 6f 77 69 64 22 29  y (i.e. "rowid")
1780: 2e 20 20 49 66 20 73 6f 2c 20 69 74 20 73 65 74  .  If so, it set
1790: 73 20 74 68 65 0d 0a 20 20 20 20 2f 2f 2f 20 3c  s the..    /// <
17a0: 70 61 72 61 6d 72 65 66 20 6e 61 6d 65 3d 22 70  paramref name="p
17b0: 72 69 6d 61 72 79 4b 65 79 4d 65 6d 62 65 72 22  rimaryKeyMember"
17c0: 20 2f 3e 20 70 61 72 61 6d 65 74 65 72 20 74 6f   /> parameter to
17d0: 20 74 68 65 20 72 69 67 68 74 0d 0a 20 20 20 20   the right..    
17e0: 2f 2f 2f 20 3c 73 65 65 20 63 72 65 66 3d 22 45  /// <see cref="E
17f0: 64 6d 4d 65 6d 62 65 72 22 20 2f 3e 3b 20 6f 74  dmMember" />; ot
1800: 68 65 72 77 69 73 65 2c 20 74 68 65 0d 0a 20 20  herwise, the..  
1810: 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 72 65 66 20    /// <paramref 
1820: 6e 61 6d 65 3d 22 70 72 69 6d 61 72 79 4b 65 79  name="primaryKey
1830: 4d 65 6d 62 65 72 22 20 2f 3e 20 70 61 72 61 6d  Member" /> param
1840: 65 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 6e  eter is set to n
1850: 75 6c 6c 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f  ull...    /// </
1860: 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f  summary>..    //
1870: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 74  / <param name="t
1880: 61 62 6c 65 22 3e 54 68 65 20 74 61 62 6c 65 20  able">The table 
1890: 74 6f 20 63 68 65 63 6b 2e 3c 2f 70 61 72 61 6d  to check.</param
18a0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
18b0: 6d 20 6e 61 6d 65 3d 22 6b 65 79 4d 65 6d 62 65  m name="keyMembe
18c0: 72 73 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68  rs">..    /// Th
18d0: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20  e collection of 
18e0: 6b 65 79 20 6d 65 6d 62 65 72 73 2e 20 20 41 6e  key members.  An
18f0: 20 61 74 74 65 6d 70 74 20 69 73 20 61 6c 77 61   attempt is alwa
1900: 79 73 20 6d 61 64 65 20 74 6f 20 73 65 74 20 74  ys made to set t
1910: 68 69 73 0d 0a 20 20 20 20 2f 2f 2f 20 70 61 72  his..    /// par
1920: 61 6d 65 74 65 72 20 74 6f 20 61 20 76 61 6c 69  ameter to a vali
1930: 64 20 76 61 6c 75 65 2e 0d 0a 20 20 20 20 2f 2f  d value...    //
1940: 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20  / </param>..    
1950: 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d  /// <param name=
1960: 22 70 72 69 6d 61 72 79 4b 65 79 4d 65 6d 62 65  "primaryKeyMembe
1970: 72 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65  r">..    /// The
1980: 20 3c 73 65 65 20 63 72 65 66 3d 22 45 64 6d 4d   <see cref="EdmM
1990: 65 6d 62 65 72 22 20 2f 3e 20 74 68 61 74 20 72  ember" /> that r
19a0: 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 69 6e  epresents the in
19b0: 74 65 67 65 72 20 70 72 69 6d 61 72 79 20 6b 65  teger primary ke
19c0: 79 0d 0a 20 20 20 20 2f 2f 2f 20 2d 4f 52 2d 20  y..    /// -OR- 
19d0: 6e 75 6c 6c 20 69 66 20 6e 6f 20 73 75 63 68 20  null if no such 
19e0: 3c 73 65 65 20 63 72 65 66 3d 22 45 64 6d 4d 65  <see cref="EdmMe
19f0: 6d 62 65 72 22 20 2f 3e 20 65 78 69 73 74 73 2e  mber" /> exists.
1a00: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61  ..    /// </para
1a10: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74  m>..    /// <ret
1a20: 75 72 6e 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e  urns>..    /// N
1a30: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
1a40: 70 65 63 69 66 69 65 64 20 74 61 62 6c 65 20 68  pecified table h
1a50: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 70 72  as an integer pr
1a60: 69 6d 61 72 79 20 6b 65 79 2e 0d 0a 20 20 20 20  imary key...    
1a70: 2f 2f 2f 20 3c 2f 72 65 74 75 72 6e 73 3e 0d 0a  /// </returns>..
1a80: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1a90: 69 63 20 62 6f 6f 6c 20 49 73 49 6e 74 65 67 65  ic bool IsIntege
1aa0: 72 50 72 69 6d 61 72 79 4b 65 79 28 0d 0a 20 20  rPrimaryKey(..  
1ab0: 20 20 20 20 20 20 45 6e 74 69 74 79 53 65 74 42        EntitySetB
1ac0: 61 73 65 20 74 61 62 6c 65 2c 0d 0a 20 20 20 20  ase table,..    
1ad0: 20 20 20 20 6f 75 74 20 52 65 61 64 4f 6e 6c 79      out ReadOnly
1ae0: 4d 65 74 61 64 61 74 61 43 6f 6c 6c 65 63 74 69  MetadataCollecti
1af0: 6f 6e 3c 45 64 6d 4d 65 6d 62 65 72 3e 20 6b 65  on<EdmMember> ke
1b00: 79 4d 65 6d 62 65 72 73 2c 0d 0a 20 20 20 20 20  yMembers,..     
1b10: 20 20 20 6f 75 74 20 45 64 6d 4d 65 6d 62 65 72     out EdmMember
1b20: 20 70 72 69 6d 61 72 79 4b 65 79 4d 65 6d 62 65   primaryKeyMembe
1b30: 72 0d 0a 20 20 20 20 20 20 20 20 29 0d 0a 20 20  r..        )..  
1b40: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 6b 65 79    {..        key
1b50: 4d 65 6d 62 65 72 73 20 3d 20 74 61 62 6c 65 2e  Members = table.
1b60: 45 6c 65 6d 65 6e 74 54 79 70 65 2e 4b 65 79 4d  ElementType.KeyM
1b70: 65 6d 62 65 72 73 3b 0d 0a 0d 0a 20 20 20 20 20  embers;....     
1b80: 20 20 20 69 66 20 28 6b 65 79 4d 65 6d 62 65 72     if (keyMember
1b90: 73 2e 43 6f 75 6e 74 20 3d 3d 20 31 29 20 2f 2a  s.Count == 1) /*
1ba0: 20 4e 4f 54 45 3a 20 54 68 65 20 22 72 6f 77 69   NOTE: The "rowi
1bb0: 64 22 20 6f 6e 6c 79 3f 20 2a 2f 0d 0a 20 20 20  d" only? */..   
1bc0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1bd0: 20 20 20 20 45 64 6d 4d 65 6d 62 65 72 20 6b 65      EdmMember ke
1be0: 79 4d 65 6d 62 65 72 20 3d 20 6b 65 79 4d 65 6d  yMember = keyMem
1bf0: 62 65 72 73 5b 30 5d 3b 0d 0a 20 20 20 20 20 20  bers[0];..      
1c00: 20 20 20 20 20 20 50 72 69 6d 69 74 69 76 65 54        PrimitiveT
1c10: 79 70 65 4b 69 6e 64 20 74 79 70 65 4b 69 6e 64  ypeKind typeKind
1c20: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1c30: 20 69 66 20 28 4d 65 74 61 64 61 74 61 48 65 6c   if (MetadataHel
1c40: 70 65 72 73 2e 54 72 79 47 65 74 50 72 69 6d 69  pers.TryGetPrimi
1c50: 74 69 76 65 54 79 70 65 4b 69 6e 64 28 0d 0a 20  tiveTypeKind(.. 
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 6b 65 79 4d 65 6d 62 65 72 2e 54 79 70     keyMember.Typ
1c80: 65 55 73 61 67 65 2c 20 6f 75 74 20 74 79 70 65  eUsage, out type
1c90: 4b 69 6e 64 29 20 26 26 0d 0a 20 20 20 20 20 20  Kind) &&..      
1ca0: 20 20 20 20 20 20 20 20 20 20 28 74 79 70 65 4b            (typeK
1cb0: 69 6e 64 20 3d 3d 20 50 72 69 6d 69 74 69 76 65  ind == Primitive
1cc0: 54 79 70 65 4b 69 6e 64 2e 49 6e 74 36 34 29 29  TypeKind.Int64))
1cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf0: 20 70 72 69 6d 61 72 79 4b 65 79 4d 65 6d 62 65   primaryKeyMembe
1d00: 72 20 3d 20 6b 65 79 4d 65 6d 62 65 72 3b 0d 0a  r = keyMember;..
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
1d30: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1d40: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1d50: 20 20 70 72 69 6d 61 72 79 4b 65 79 4d 65 6d 62    primaryKeyMemb
1d60: 65 72 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  er = null;..    
1d70: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
1d80: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1d90: 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20  /// <summary>.. 
1da0: 20 20 20 2f 2f 2f 20 54 68 69 73 20 6d 65 74 68     /// This meth
1db0: 6f 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64  od attempts to d
1dc0: 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20  etermine if all 
1dd0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6b 65  the specified ke
1de0: 79 20 6d 65 6d 62 65 72 73 20 68 61 76 65 0d 0a  y members have..
1df0: 20 20 20 20 2f 2f 2f 20 76 61 6c 75 65 73 20 61      /// values a
1e00: 76 61 69 6c 61 62 6c 65 2e 0d 0a 20 20 20 20 2f  vailable...    /
1e10: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
1e20: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
1e30: 6d 65 3d 22 74 72 61 6e 73 6c 61 74 6f 72 22 3e  me="translator">
1e40: 0d 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 3c 73  ..    /// The <s
1e50: 65 65 20 63 72 65 66 3d 22 45 78 70 72 65 73 73  ee cref="Express
1e60: 69 6f 6e 54 72 61 6e 73 6c 61 74 6f 72 22 20 2f  ionTranslator" /
1e70: 3e 20 74 6f 20 75 73 65 2e 0d 0a 20 20 20 20 2f  > to use...    /
1e80: 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20  // </param>..   
1e90: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
1ea0: 3d 22 6b 65 79 4d 65 6d 62 65 72 73 22 3e 0d 0a  ="keyMembers">..
1eb0: 20 20 20 20 2f 2f 2f 20 54 68 65 20 63 6f 6c 6c      /// The coll
1ec0: 65 63 74 69 6f 6e 20 6f 66 20 6b 65 79 20 6d 65  ection of key me
1ed0: 6d 62 65 72 73 20 74 6f 20 63 68 65 63 6b 2e 0d  mbers to check..
1ee0: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d  .    /// </param
1ef0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61  >..    /// <para
1f00: 6d 20 6e 61 6d 65 3d 22 6d 69 73 73 69 6e 67 4b  m name="missingK
1f10: 65 79 4d 65 6d 62 65 72 22 3e 0d 0a 20 20 20 20  eyMember">..    
1f20: 2f 2f 2f 20 54 68 65 20 66 69 72 73 74 20 6d 69  /// The first mi
1f30: 73 73 69 6e 67 20 6b 65 79 20 6d 65 6d 62 65 72  ssing key member
1f40: 20 74 68 61 74 20 69 73 20 66 6f 75 6e 64 2e 20   that is found. 
1f50: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 73 65   This is only se
1f60: 74 20 74 6f 20 61 20 76 61 6c 69 64 0d 0a 20 20  t to a valid..  
1f70: 20 20 2f 2f 2f 20 76 61 6c 75 65 20 69 66 20 74    /// value if t
1f80: 68 65 20 6d 65 74 68 6f 64 20 69 73 20 72 65 74  he method is ret
1f90: 75 72 6e 69 6e 67 20 66 61 6c 73 65 2e 0d 0a 20  urning false... 
1fa0: 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d 3e 0d     /// </param>.
1fb0: 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 74 75 72 6e  .    /// <return
1fc0: 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e 6f 6e 2d  s>..    /// Non-
1fd0: 7a 65 72 6f 20 69 66 20 61 6c 6c 20 6b 65 79 20  zero if all key 
1fe0: 6d 65 6d 62 65 72 73 20 68 61 76 65 20 76 61 6c  members have val
1ff0: 75 65 73 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ues; otherwise, 
2000: 7a 65 72 6f 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c  zero...    /// <
2010: 2f 72 65 74 75 72 6e 73 3e 0d 0a 20 20 20 20 70  /returns>..    p
2020: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f  rivate static bo
2030: 6f 6c 20 44 6f 41 6c 6c 4b 65 79 4d 65 6d 62 65  ol DoAllKeyMembe
2040: 72 73 48 61 76 65 56 61 6c 75 65 73 28 0d 0a 20  rsHaveValues(.. 
2050: 20 20 20 20 20 20 20 45 78 70 72 65 73 73 69 6f         Expressio
2060: 6e 54 72 61 6e 73 6c 61 74 6f 72 20 74 72 61 6e  nTranslator tran
2070: 73 6c 61 74 6f 72 2c 0d 0a 20 20 20 20 20 20 20  slator,..       
2080: 20 52 65 61 64 4f 6e 6c 79 4d 65 74 61 64 61 74   ReadOnlyMetadat
2090: 61 43 6f 6c 6c 65 63 74 69 6f 6e 3c 45 64 6d 4d  aCollection<EdmM
20a0: 65 6d 62 65 72 3e 20 6b 65 79 4d 65 6d 62 65 72  ember> keyMember
20b0: 73 2c 0d 0a 20 20 20 20 20 20 20 20 6f 75 74 20  s,..        out 
20c0: 45 64 6d 4d 65 6d 62 65 72 20 6d 69 73 73 69 6e  EdmMember missin
20d0: 67 4b 65 79 4d 65 6d 62 65 72 0d 0a 20 20 20 20  gKeyMember..    
20e0: 20 20 20 20 29 0d 0a 20 20 20 20 7b 0d 0a 20 20      )..    {..  
20f0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 45        foreach (E
2100: 64 6d 4d 65 6d 62 65 72 20 6b 65 79 4d 65 6d 62  dmMember keyMemb
2110: 65 72 20 69 6e 20 6b 65 79 4d 65 6d 62 65 72 73  er in keyMembers
2120: 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
2130: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 74            if (!t
2140: 72 61 6e 73 6c 61 74 6f 72 2e 4d 65 6d 62 65 72  ranslator.Member
2150: 56 61 6c 75 65 73 2e 43 6f 6e 74 61 69 6e 73 4b  Values.ContainsK
2160: 65 79 28 6b 65 79 4d 65 6d 62 65 72 29 29 0d 0a  ey(keyMember))..
2170: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
2190: 69 73 73 69 6e 67 4b 65 79 4d 65 6d 62 65 72 20  issingKeyMember 
21a0: 3d 20 6b 65 79 4d 65 6d 62 65 72 3b 0d 0a 20 20  = keyMember;..  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
21c0: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
21d0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
21e0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21f0: 20 6d 69 73 73 69 6e 67 4b 65 79 4d 65 6d 62 65   missingKeyMembe
2200: 72 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  r = null;..     
2210: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
2220: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 2f 2f  .    }....    //
2230: 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20  / <summary>..   
2240: 20 2f 2f 2f 20 47 65 6e 65 72 61 74 65 73 20 53   /// Generates S
2250: 51 4c 20 66 72 61 67 6d 65 6e 74 20 72 65 74 75  QL fragment retu
2260: 72 6e 69 6e 67 20 73 65 72 76 65 72 2d 67 65 6e  rning server-gen
2270: 65 72 61 74 65 64 20 76 61 6c 75 65 73 2e 0d 0a  erated values...
2280: 20 20 20 20 2f 2f 2f 20 52 65 71 75 69 72 65 73      /// Requires
2290: 3a 20 74 72 61 6e 73 6c 61 74 6f 72 20 6b 6e 6f  : translator kno
22a0: 77 73 20 61 62 6f 75 74 20 6d 65 6d 62 65 72 20  ws about member 
22b0: 76 61 6c 75 65 73 20 73 6f 20 74 68 61 74 20 77  values so that w
22c0: 65 20 63 61 6e 20 66 69 67 75 72 65 20 6f 75 74  e can figure out
22d0: 0d 0a 20 20 20 20 2f 2f 2f 20 68 6f 77 20 74 6f  ..    /// how to
22e0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 6b   construct the k
22f0: 65 79 20 70 72 65 64 69 63 61 74 65 2e 0d 0a 20  ey predicate... 
2300: 20 20 20 2f 2f 2f 20 3c 63 6f 64 65 3e 0d 0a 20     /// <code>.. 
2310: 20 20 20 2f 2f 2f 20 53 61 6d 70 6c 65 20 53 51     /// Sample SQ
2320: 4c 3a 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20  L:..    ///     
2330: 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 73 65  ..    ///     se
2340: 6c 65 63 74 20 49 64 65 6e 74 69 74 79 56 61 6c  lect IdentityVal
2350: 75 65 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20  ue..    ///     
2360: 66 72 6f 6d 20 64 62 6f 2e 4d 79 54 61 62 6c 65  from dbo.MyTable
2370: 0d 0a 20 20 20 20 2f 2f 2f 20 20 20 20 20 77 68  ..    ///     wh
2380: 65 72 65 20 40 40 52 4f 57 43 4f 55 4e 54 20 3e  ere @@ROWCOUNT >
2390: 20 30 20 61 6e 64 20 49 64 65 6e 74 69 74 79 56   0 and IdentityV
23a0: 61 6c 75 65 20 3d 20 73 63 6f 70 65 5f 69 64 65  alue = scope_ide
23b0: 6e 74 69 74 79 28 29 0d 0a 20 20 20 20 2f 2f 2f  ntity()..    ///
23c0: 20 0d 0a 20 20 20 20 2f 2f 2f 20 6f 72 0d 0a 20   ..    /// or.. 
23d0: 20 20 20 2f 2f 2f 20 0d 0a 20 20 20 20 2f 2f 2f     /// ..    ///
23e0: 20 20 20 20 20 73 65 6c 65 63 74 20 54 69 6d 65       select Time
23f0: 73 74 61 6d 70 74 56 61 6c 75 65 0d 0a 20 20 20  stamptValue..   
2400: 20 2f 2f 2f 20 20 20 20 20 66 72 6f 6d 20 64 62   ///     from db
2410: 6f 2e 4d 79 54 61 62 6c 65 0d 0a 20 20 20 20 2f  o.MyTable..    /
2420: 2f 2f 20 20 20 20 20 77 68 65 72 65 20 40 40 52  //     where @@R
2430: 4f 57 43 4f 55 4e 54 20 3e 20 30 20 61 6e 64 20  OWCOUNT > 0 and 
2440: 49 64 20 3d 20 31 0d 0a 20 20 20 20 2f 2f 2f 20  Id = 1..    /// 
2450: 0d 0a 20 20 20 20 2f 2f 2f 20 4e 6f 74 65 20 74  ..    /// Note t
2460: 68 61 74 20 77 65 20 66 69 6c 74 65 72 20 6f 6e  hat we filter on
2470: 20 72 6f 77 63 6f 75 6e 74 20 74 6f 20 65 6e 73   rowcount to ens
2480: 75 72 65 20 6e 6f 20 72 6f 77 73 20 61 72 65 20  ure no rows are 
2490: 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 72  returned if no r
24a0: 6f 77 73 20 77 65 72 65 20 6d 6f 64 69 66 69 65  ows were modifie
24b0: 64 2e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 63 6f  d...    /// </co
24c0: 64 65 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 2f 73  de>..    /// </s
24d0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 2f 2f 2f  ummary>..    ///
24e0: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f   <param name="co
24f0: 6d 6d 61 6e 64 54 65 78 74 22 3e 42 75 69 6c 64  mmandText">Build
2500: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f  er containing co
2510: 6d 6d 61 6e 64 20 74 65 78 74 3c 2f 70 61 72 61  mmand text</para
2520: 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  m>..    /// <par
2530: 61 6d 20 6e 61 6d 65 3d 22 74 72 65 65 22 3e 4d  am name="tree">M
2540: 6f 64 69 66 69 63 61 74 69 6f 6e 20 63 6f 6d 6d  odification comm
2550: 61 6e 64 20 74 72 65 65 3c 2f 70 61 72 61 6d 3e  and tree</param>
2560: 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d  ..    /// <param
2570: 20 6e 61 6d 65 3d 22 74 72 61 6e 73 6c 61 74 6f   name="translato
2580: 72 22 3e 54 72 61 6e 73 6c 61 74 6f 72 20 75 73  r">Translator us
2590: 65 64 20 74 6f 20 70 72 6f 64 75 63 65 20 44 4d  ed to produce DM
25a0: 4c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0d  L SQL statement.
25b0: 0a 20 20 20 20 2f 2f 2f 20 66 6f 72 20 74 68 65  .    /// for the
25c0: 20 74 72 65 65 3c 2f 70 61 72 61 6d 3e 0d 0a 20   tree</param>.. 
25d0: 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61     /// <param na
25e0: 6d 65 3d 22 72 65 74 75 72 6e 69 6e 67 22 3e 52  me="returning">R
25f0: 65 74 75 72 6e 69 6e 67 20 65 78 70 72 65 73 73  eturning express
2600: 69 6f 6e 2e 20 49 66 20 6e 75 6c 6c 2c 20 74 68  ion. If null, th
2610: 65 20 6d 65 74 68 6f 64 20 72 65 74 75 72 6e 73  e method returns
2620: 0d 0a 20 20 20 20 2f 2f 2f 20 69 6d 6d 65 64 69  ..    /// immedi
2630: 61 74 65 6c 79 20 77 69 74 68 6f 75 74 20 70 72  ately without pr
2640: 6f 64 75 63 69 6e 67 20 61 20 53 45 4c 45 43 54  oducing a SELECT
2650: 20 73 74 61 74 65 6d 65 6e 74 2e 3c 2f 70 61 72   statement.</par
2660: 61 6d 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61  am>..    /// <pa
2670: 72 61 6d 20 6e 61 6d 65 3d 22 77 61 73 49 6e 73  ram name="wasIns
2680: 65 72 74 22 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4e  ert">..    /// N
2690: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 69 73 20  on-zero if this 
26a0: 6d 65 74 68 6f 64 20 69 73 20 62 65 69 6e 67 20  method is being 
26b0: 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f  called as part o
26c0: 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  f processing an 
26d0: 49 4e 53 45 52 54 3b 0d 0a 20 20 20 20 2f 2f 2f  INSERT;..    ///
26e0: 20 6f 74 68 65 72 77 69 73 65 20 28 65 2e 67 2e   otherwise (e.g.
26f0: 20 55 50 44 41 54 45 29 2c 20 7a 65 72 6f 2e 0d   UPDATE), zero..
2700: 0a 20 20 20 20 2f 2f 2f 20 3c 2f 70 61 72 61 6d  .    /// </param
2710: 3e 0d 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  >..    private s
2720: 74 61 74 69 63 20 76 6f 69 64 20 47 65 6e 65 72  tatic void Gener
2730: 61 74 65 52 65 74 75 72 6e 69 6e 67 53 71 6c 28  ateReturningSql(
2740: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 63 6f  StringBuilder co
2750: 6d 6d 61 6e 64 54 65 78 74 2c 20 44 62 4d 6f 64  mmandText, DbMod
2760: 69 66 69 63 61 74 69 6f 6e 43 6f 6d 6d 61 6e 64  ificationCommand
2770: 54 72 65 65 20 74 72 65 65 2c 0d 0a 20 20 20 20  Tree tree,..    
2780: 20 20 20 20 45 78 70 72 65 73 73 69 6f 6e 54 72      ExpressionTr
2790: 61 6e 73 6c 61 74 6f 72 20 74 72 61 6e 73 6c 61  anslator transla
27a0: 74 6f 72 2c 20 44 62 45 78 70 72 65 73 73 69 6f  tor, DbExpressio
27b0: 6e 20 72 65 74 75 72 6e 69 6e 67 2c 20 62 6f 6f  n returning, boo
27c0: 6c 20 77 61 73 49 6e 73 65 72 74 29 0d 0a 20 20  l wasInsert)..  
27d0: 20 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 20 4e 6f    {..      // No
27e0: 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 66 20 74  thing to do if t
27f0: 68 65 72 65 20 69 73 20 6e 6f 20 52 65 74 75 72  here is no Retur
2800: 6e 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 0d  ning expression.
2810: 0a 20 20 20 20 20 20 69 66 20 28 6e 75 6c 6c 20  .      if (null 
2820: 3d 3d 20 72 65 74 75 72 6e 69 6e 67 29 20 7b 20  == returning) { 
2830: 72 65 74 75 72 6e 3b 20 7d 0d 0a 0d 0a 20 20 20  return; }....   
2840: 20 20 20 2f 2f 20 73 65 6c 65 63 74 0d 0a 20 20     // select..  
2850: 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e      commandText.
2860: 41 70 70 65 6e 64 28 22 53 45 4c 45 43 54 20 22  Append("SELECT "
2870: 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
2880: 69 6e 67 2e 41 63 63 65 70 74 28 74 72 61 6e 73  ing.Accept(trans
2890: 6c 61 74 6f 72 29 3b 0d 0a 20 20 20 20 20 20 63  lator);..      c
28a0: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
28b0: 64 4c 69 6e 65 28 29 3b 0d 0a 0d 0a 20 20 20 20  dLine();....    
28c0: 20 20 2f 2f 20 66 72 6f 6d 0d 0a 20 20 20 20 20    // from..     
28d0: 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70   commandText.App
28e0: 65 6e 64 28 22 46 52 4f 4d 20 22 29 3b 0d 0a 20  end("FROM ");.. 
28f0: 20 20 20 20 20 74 72 65 65 2e 54 61 72 67 65 74       tree.Target
2900: 2e 45 78 70 72 65 73 73 69 6f 6e 2e 41 63 63 65  .Expression.Acce
2910: 70 74 28 74 72 61 6e 73 6c 61 74 6f 72 29 3b 0d  pt(translator);.
2920: 0a 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65  .      commandTe
2930: 78 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 29 3b  xt.AppendLine();
2940: 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 77 68 65  ....      // whe
2950: 72 65 0d 0a 23 69 66 20 55 53 45 5f 49 4e 54 45  re..#if USE_INTE
2960: 52 4f 50 5f 44 4c 4c 20 26 26 20 49 4e 54 45 52  ROP_DLL && INTER
2970: 4f 50 5f 45 58 54 45 4e 53 49 4f 4e 5f 46 55 4e  OP_EXTENSION_FUN
2980: 43 54 49 4f 4e 53 0d 0a 20 20 20 20 20 20 63 6f  CTIONS..      co
2990: 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64  mmandText.Append
29a0: 28 22 57 48 45 52 45 20 6c 61 73 74 5f 72 6f 77  ("WHERE last_row
29b0: 73 5f 61 66 66 65 63 74 65 64 28 29 20 3e 20 30  s_affected() > 0
29c0: 22 29 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 20 20  ");..#else..    
29d0: 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70    commandText.Ap
29e0: 70 65 6e 64 28 22 57 48 45 52 45 20 63 68 61 6e  pend("WHERE chan
29f0: 67 65 73 28 29 20 3e 20 30 22 29 3b 0d 0a 23 65  ges() > 0");..#e
2a00: 6e 64 69 66 0d 0a 0d 0a 20 20 20 20 20 20 45 6e  ndif....      En
2a10: 74 69 74 79 53 65 74 42 61 73 65 20 74 61 62 6c  titySetBase tabl
2a20: 65 20 3d 20 28 28 44 62 53 63 61 6e 45 78 70 72  e = ((DbScanExpr
2a30: 65 73 73 69 6f 6e 29 74 72 65 65 2e 54 61 72 67  ession)tree.Targ
2a40: 65 74 2e 45 78 70 72 65 73 73 69 6f 6e 29 2e 54  et.Expression).T
2a50: 61 72 67 65 74 3b 0d 0a 20 20 20 20 20 20 52 65  arget;..      Re
2a60: 61 64 4f 6e 6c 79 4d 65 74 61 64 61 74 61 43 6f  adOnlyMetadataCo
2a70: 6c 6c 65 63 74 69 6f 6e 3c 45 64 6d 4d 65 6d 62  llection<EdmMemb
2a80: 65 72 3e 20 6b 65 79 4d 65 6d 62 65 72 73 3b 0d  er> keyMembers;.
2a90: 0a 20 20 20 20 20 20 45 64 6d 4d 65 6d 62 65 72  .      EdmMember
2aa0: 20 70 72 69 6d 61 72 79 4b 65 79 4d 65 6d 62 65   primaryKeyMembe
2ab0: 72 3b 0d 0a 20 20 20 20 20 20 45 64 6d 4d 65 6d  r;..      EdmMem
2ac0: 62 65 72 20 6d 69 73 73 69 6e 67 4b 65 79 4d 65  ber missingKeyMe
2ad0: 6d 62 65 72 3b 0d 0a 0d 0a 20 20 20 20 20 20 2f  mber;....      /
2ae0: 2f 20 4d 6f 64 65 6c 20 54 79 70 65 73 20 63 61  / Model Types ca
2af0: 6e 20 62 65 20 28 61 74 20 74 68 65 20 74 69 6d  n be (at the tim
2b00: 65 20 6f 66 20 74 68 69 73 20 69 6d 70 6c 65 6d  e of this implem
2b10: 65 6e 74 61 74 69 6f 6e 29 3a 0d 0a 20 20 20 20  entation):..    
2b20: 20 20 2f 2f 20 20 20 20 20 20 42 69 6e 61 72 79    //      Binary
2b30: 2c 20 42 6f 6f 6c 65 61 6e 2c 20 42 79 74 65 2c  , Boolean, Byte,
2b40: 20 44 61 74 65 54 69 6d 65 2c 20 44 65 63 69 6d   DateTime, Decim
2b50: 61 6c 2c 20 44 6f 75 62 6c 65 2c 20 47 75 69 64  al, Double, Guid
2b60: 2c 20 49 6e 74 31 36 2c 0d 0a 20 20 20 20 20 20  , Int16,..      
2b70: 2f 2f 20 20 20 20 20 20 49 6e 74 33 32 2c 20 49  //      Int32, I
2b80: 6e 74 36 34 2c 53 69 6e 67 6c 65 2c 20 53 74 72  nt64,Single, Str
2b90: 69 6e 67 0d 0a 20 20 20 20 20 20 69 66 20 28 49  ing..      if (I
2ba0: 73 49 6e 74 65 67 65 72 50 72 69 6d 61 72 79 4b  sIntegerPrimaryK
2bb0: 65 79 28 74 61 62 6c 65 2c 20 6f 75 74 20 6b 65  ey(table, out ke
2bc0: 79 4d 65 6d 62 65 72 73 2c 20 6f 75 74 20 70 72  yMembers, out pr
2bd0: 69 6d 61 72 79 4b 65 79 4d 65 6d 62 65 72 29 29  imaryKeyMember))
2be0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
2bf0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2c00: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73     // NOTE: This
2c10: 20 6d 75 73 74 20 62 65 20 61 6e 20 49 4e 54 45   must be an INTE
2c20: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
2c30: 28 69 2e 65 2e 20 22 72 6f 77 69 64 22 29 20 74  (i.e. "rowid") t
2c40: 61 62 6c 65 2e 0d 0a 20 20 20 20 20 20 20 20 20  able...         
2c50: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 63   //..          c
2c60: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
2c70: 64 28 22 20 41 4e 44 20 22 29 3b 0d 0a 20 20 20  d(" AND ");..   
2c80: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65         commandTe
2c90: 78 74 2e 41 70 70 65 6e 64 28 47 65 6e 65 72 61  xt.Append(Genera
2ca0: 74 65 4d 65 6d 62 65 72 54 53 71 6c 28 70 72 69  teMemberTSql(pri
2cb0: 6d 61 72 79 4b 65 79 4d 65 6d 62 65 72 29 29 3b  maryKeyMember));
2cc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d  ..          comm
2cd0: 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 28 22  andText.Append("
2ce0: 20 3d 20 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20   = ");....      
2cf0: 20 20 20 20 44 62 50 61 72 61 6d 65 74 65 72 20      DbParameter 
2d00: 76 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  value;....      
2d10: 20 20 20 20 69 66 20 28 74 72 61 6e 73 6c 61 74      if (translat
2d20: 6f 72 2e 4d 65 6d 62 65 72 56 61 6c 75 65 73 2e  or.MemberValues.
2d30: 54 72 79 47 65 74 56 61 6c 75 65 28 70 72 69 6d  TryGetValue(prim
2d40: 61 72 79 4b 65 79 4d 65 6d 62 65 72 2c 20 6f 75  aryKeyMember, ou
2d50: 74 20 76 61 6c 75 65 29 29 0d 0a 20 20 20 20 20  t value))..     
2d60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
2d70: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2d80: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
2d90: 20 55 73 65 20 74 68 65 20 69 6e 74 65 67 65 72   Use the integer
2da0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76 61 6c   primary key val
2db0: 75 65 20 74 68 61 74 20 77 61 73 20 73 70 65 63  ue that was spec
2dc0: 69 66 69 65 64 20 61 73 0d 0a 20 20 20 20 20 20  ified as..      
2dd0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
2de0: 20 70 61 72 74 20 74 68 65 20 61 73 73 6f 63 69   part the associ
2df0: 61 74 65 64 20 49 4e 53 45 52 54 2f 55 50 44 41  ated INSERT/UPDA
2e00: 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0d 0a 20  TE statement... 
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
2e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2e30: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
2e40: 64 28 76 61 6c 75 65 2e 50 61 72 61 6d 65 74 65  d(value.Paramete
2e50: 72 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20  rName);..       
2e60: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2e70: 65 6c 73 65 20 69 66 20 28 77 61 73 49 6e 73 65  else if (wasInse
2e80: 72 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 7b  rt)..          {
2e90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ea0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
2eb0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69 73 20    // NOTE: This 
2ec0: 77 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 49  was part of an I
2ed0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 20  NSERT statement 
2ee0: 61 6e 64 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  and we know the 
2ef0: 74 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20  table..         
2f00: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 68 61       //       ha
2f10: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 70 72 69  s an integer pri
2f20: 6d 61 72 79 20 6b 65 79 2e 20 20 54 68 69 73 20  mary key.  This 
2f30: 73 68 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 20  should not fail 
2f40: 75 6e 6c 65 73 73 0d 0a 20 20 20 20 20 20 20 20  unless..        
2f50: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 73        //       s
2f60: 6f 6d 65 74 68 69 6e 67 20 28 65 2e 67 2e 20 61  omething (e.g. a
2f70: 20 74 72 69 67 67 65 72 29 20 63 61 75 73 65 73   trigger) causes
2f80: 20 74 68 65 20 6c 61 73 74 5f 69 6e 73 65 72 74   the last_insert
2f90: 5f 72 6f 77 69 64 28 29 0d 0a 20 20 20 20 20 20  _rowid()..      
2fa0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
2fb0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74   function to ret
2fc0: 75 72 6e 20 61 6e 20 69 6e 63 6f 72 72 65 63 74  urn an incorrect
2fd0: 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20 20   result...      
2fe0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2ff0: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e            comman
3000: 64 54 65 78 74 2e 41 70 70 65 6e 64 4c 69 6e 65  dText.AppendLine
3010: 28 22 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  ("last_insert_ro
3020: 77 69 64 28 29 22 29 3b 0d 0a 20 20 20 20 20 20  wid()");..      
3030: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
3040: 20 65 6c 73 65 20 2f 2a 20 4e 4f 54 2d 52 45 41   else /* NOT-REA
3050: 43 48 45 44 3f 20 2a 2f 0d 0a 20 20 20 20 20 20  CHED? */..      
3060: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
3070: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3080: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
3090: 57 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  We cannot simply
30a0: 20 75 73 65 20 74 68 65 20 22 72 6f 77 69 64 22   use the "rowid"
30b0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 62   at this point b
30c0: 65 63 61 75 73 65 3a 0d 0a 20 20 20 20 20 20 20  ecause:..       
30d0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
30e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
30f0: 20 20 31 2e 20 54 68 65 20 6c 61 73 74 5f 69 6e    1. The last_in
3100: 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66 75 6e  sert_rowid() fun
3110: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 76 61  ction is only va
3120: 6c 69 64 20 61 66 74 65 72 0d 0a 20 20 20 20 20  lid after..     
3130: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
3140: 20 20 20 20 20 61 6e 20 49 4e 53 45 52 54 20 61       an INSERT a
3150: 6e 64 20 74 68 69 73 20 77 61 73 20 61 6e 20 55  nd this was an U
3160: 50 44 41 54 45 2e 0d 0a 20 20 20 20 20 20 20 20  PDATE...        
3170: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3180: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
3190: 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64 45 78  w NotSupportedEx
31a0: 63 65 70 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46  ception(String.F
31b0: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
31c0: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
31d0: 6e 67 20 76 61 6c 75 65 20 66 6f 72 20 49 4e 53  ng value for INS
31e0: 45 52 54 20 6b 65 79 20 6d 65 6d 62 65 72 20 27  ERT key member '
31f0: 7b 30 7d 27 20 69 6e 20 74 61 62 6c 65 20 27 7b  {0}' in table '{
3200: 31 7d 27 2e 22 2c 0d 0a 20 20 20 20 20 20 20 20  1}'.",..        
3210: 20 20 20 20 20 20 20 20 20 20 20 28 70 72 69 6d             (prim
3220: 61 72 79 4b 65 79 4d 65 6d 62 65 72 20 21 3d 20  aryKeyMember != 
3230: 6e 75 6c 6c 29 20 3f 20 70 72 69 6d 61 72 79 4b  null) ? primaryK
3240: 65 79 4d 65 6d 62 65 72 2e 4e 61 6d 65 20 3a 20  eyMember.Name : 
3250: 22 3c 75 6e 6b 6e 6f 77 6e 3e 22 2c 0d 0a 20 20  "<unknown>",..  
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 74 61 62 6c 65 2e 4e 61 6d 65 29 29 3b 0d 0a   table.Name));..
3280: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3290: 20 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65     }..      else
32a0: 20 69 66 20 28 44 6f 41 6c 6c 4b 65 79 4d 65 6d   if (DoAllKeyMem
32b0: 62 65 72 73 48 61 76 65 56 61 6c 75 65 73 28 74  bersHaveValues(t
32c0: 72 61 6e 73 6c 61 74 6f 72 2c 20 6b 65 79 4d 65  ranslator, keyMe
32d0: 6d 62 65 72 73 2c 20 6f 75 74 20 6d 69 73 73 69  mbers, out missi
32e0: 6e 67 4b 65 79 4d 65 6d 62 65 72 29 29 0d 0a 20  ngKeyMember)).. 
32f0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
3300: 20 20 66 6f 72 65 61 63 68 20 28 45 64 6d 4d 65    foreach (EdmMe
3310: 6d 62 65 72 20 6b 65 79 4d 65 6d 62 65 72 20 69  mber keyMember i
3320: 6e 20 6b 65 79 4d 65 6d 62 65 72 73 29 0d 0a 20  n keyMembers).. 
3330: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3340: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e            comman
3350: 64 54 65 78 74 2e 41 70 70 65 6e 64 28 22 20 41  dText.Append(" A
3360: 4e 44 20 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ND ");..        
3370: 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78        commandTex
3380: 74 2e 41 70 70 65 6e 64 28 47 65 6e 65 72 61 74  t.Append(Generat
3390: 65 4d 65 6d 62 65 72 54 53 71 6c 28 6b 65 79 4d  eMemberTSql(keyM
33a0: 65 6d 62 65 72 29 29 3b 0d 0a 20 20 20 20 20 20  ember));..      
33b0: 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54          commandT
33c0: 65 78 74 2e 41 70 70 65 6e 64 28 22 20 3d 20 22  ext.Append(" = "
33d0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
33e0: 20 20 20 20 2f 2f 20 52 65 74 72 69 65 76 65 20      // Retrieve 
33f0: 6d 65 6d 62 65 72 20 76 61 6c 75 65 20 53 51 4c  member value SQL
3400: 2e 20 74 68 65 20 74 72 61 6e 73 6c 61 74 6f 72  . the translator
3410: 20 72 65 6d 65 6d 62 65 72 73 20 6d 65 6d 62 65   remembers membe
3420: 72 20 76 61 6c 75 65 73 0d 0a 20 20 20 20 20 20  r values..      
3430: 20 20 20 20 20 20 20 20 2f 2f 20 61 73 20 69 74          // as it
3440: 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 65 20   constructs the 
3450: 44 4d 4c 20 73 74 61 74 65 6d 65 6e 74 20 28 77  DML statement (w
3460: 68 69 63 68 20 70 72 65 63 65 64 65 73 20 74 68  hich precedes th
3470: 65 20 22 72 65 74 75 72 6e 69 6e 67 22 0d 0a 20  e "returning".. 
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3490: 53 51 4c 29 2e 0d 0a 20 20 20 20 20 20 20 20 20  SQL)...         
34a0: 20 20 20 20 20 44 62 50 61 72 61 6d 65 74 65 72       DbParameter
34b0: 20 76 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20   value;....     
34c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 74 72 61           if (tra
34d0: 6e 73 6c 61 74 6f 72 2e 4d 65 6d 62 65 72 56 61  nslator.MemberVa
34e0: 6c 75 65 73 2e 54 72 79 47 65 74 56 61 6c 75 65  lues.TryGetValue
34f0: 28 6b 65 79 4d 65 6d 62 65 72 2c 20 6f 75 74 20  (keyMember, out 
3500: 76 61 6c 75 65 29 29 0d 0a 20 20 20 20 20 20 20  value))..       
3510: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
3520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 2f 2f 20 4e 4f 54 45 3a 20 55 73 65 20 74    // NOTE: Use t
3550: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 76  he primary key v
3560: 61 6c 75 65 20 74 68 61 74 20 77 61 73 20 73 70  alue that was sp
3570: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
3580: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
3590: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
35a0: 61 73 73 6f 63 69 61 74 65 64 20 49 4e 53 45 52  associated INSER
35b0: 54 2f 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  T/UPDATE stateme
35c0: 6e 74 2e 20 20 54 68 69 73 20 61 6c 73 6f 20 61  nt.  This also a
35d0: 70 70 6c 69 65 73 0d 0a 20 20 20 20 20 20 20 20  pplies..        
35e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
35f0: 20 20 20 74 6f 20 63 6f 6d 70 6f 73 69 74 65 20     to composite 
3600: 70 72 69 6d 61 72 79 20 6b 65 79 73 2e 0d 0a 20  primary keys... 
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
3630: 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65         commandTe
3640: 78 74 2e 41 70 70 65 6e 64 28 76 61 6c 75 65 2e  xt.Append(value.
3650: 50 61 72 61 6d 65 74 65 72 4e 61 6d 65 29 3b 0d  ParameterName);.
3660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3670: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3680: 65 6c 73 65 20 2f 2a 20 4e 4f 54 2d 52 45 41 43  else /* NOT-REAC
3690: 48 45 44 3f 20 2a 2f 0d 0a 20 20 20 20 20 20 20  HED? */..       
36a0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 65 20 63 61    // NOTE: We ca
36e0: 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 75 73 65 20  nnot simply use 
36f0: 74 68 65 20 22 72 6f 77 69 64 22 20 61 74 20 74  the "rowid" at t
3700: 68 69 73 20 70 6f 69 6e 74 20 62 65 63 61 75 73  his point becaus
3710: 65 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e:..            
3720: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
3740: 20 20 20 20 20 31 2e 20 54 68 69 73 20 61 73 73       1. This ass
3750: 6f 63 69 61 74 65 64 20 49 4e 53 45 52 54 2f 55  ociated INSERT/U
3760: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  PDATE statement 
3770: 61 70 70 65 61 72 65 64 20 74 6f 0d 0a 20 20 20  appeared to..   
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3790: 2f 20 20 20 20 20 20 20 20 20 20 68 61 76 65 20  /          have 
37a0: 61 6c 6c 20 74 68 65 20 6b 65 79 20 6d 65 6d 62  all the key memb
37b0: 65 72 73 20 61 76 61 69 6c 61 62 3b 65 20 68 6f  ers availab;e ho
37c0: 77 65 76 65 72 2c 20 74 68 65 72 65 0d 0a 20 20  wever, there..  
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 2f 2f 20 20 20 20 20 20 20 20 20 20 61 70 70 65  //          appe
37f0: 61 72 73 20 74 6f 20 62 65 20 61 6e 20 69 6e 63  ars to be an inc
3800: 6f 6e 73 69 73 74 65 6e 63 79 2e 20 20 54 68 69  onsistency.  Thi
3810: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
3820: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3830: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20 20      //          
3840: 65 72 72 6f 72 20 61 6e 64 20 73 68 6f 75 6c 64  error and should
3850: 20 62 65 20 74 68 72 6f 77 6e 2e 0d 0a 20 20 20   be thrown...   
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3870: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
3880: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e       throw new N
3890: 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63 65 70  otSupportedExcep
38a0: 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d  tion(String.Form
38b0: 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
38c0: 20 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73             "Miss
38d0: 69 6e 67 20 76 61 6c 75 65 20 66 6f 72 20 7b 30  ing value for {0
38e0: 7d 20 6b 65 79 20 6d 65 6d 62 65 72 20 27 7b 31  } key member '{1
38f0: 7d 27 20 69 6e 20 74 61 62 6c 65 20 27 7b 32 7d  }' in table '{2}
3900: 27 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  ' " +..         
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 28 69               "(i
3920: 6e 74 65 72 6e 61 6c 29 2e 22 2c 20 77 61 73 49  nternal).", wasI
3930: 6e 73 65 72 74 20 3f 20 22 49 4e 53 45 52 54 22  nsert ? "INSERT"
3940: 20 3a 20 22 55 50 44 41 54 45 22 2c 0d 0a 20 20   : "UPDATE",..  
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 20 20 28 6b 65 79 4d 65 6d 62 65 72 20 21      (keyMember !
3970: 3d 20 6e 75 6c 6c 29 20 3f 20 6b 65 79 4d 65 6d  = null) ? keyMem
3980: 62 65 72 2e 4e 61 6d 65 20 3a 20 22 3c 75 6e 6b  ber.Name : "<unk
3990: 6e 6f 77 6e 3e 22 2c 0d 0a 20 20 20 20 20 20 20  nown>",..       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
39b0: 61 62 6c 65 2e 4e 61 6d 65 29 29 3b 0d 0a 20 20  able.Name));..  
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
39d0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
39e0: 20 20 7d 0d 0a 20 20 20 20 20 20 65 6c 73 65 20    }..      else 
39f0: 69 66 20 28 77 61 73 49 6e 73 65 72 74 29 20 2f  if (wasInsert) /
3a00: 2a 20 4e 4f 54 2d 52 45 41 43 48 45 44 3f 20 2a  * NOT-REACHED? *
3a10: 2f 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  /..      {..    
3a20: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3a30: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68 69      // NOTE: Thi
3a40: 73 20 77 61 73 20 70 61 72 74 20 6f 66 20 61 6e  s was part of an
3a50: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
3a60: 74 3b 20 74 72 79 20 75 73 69 6e 67 20 74 68 65  t; try using the
3a70: 20 22 72 6f 77 69 64 22 0d 0a 20 20 20 20 20 20   "rowid"..      
3a80: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63 6f 6c      //       col
3a90: 75 6d 6e 20 74 6f 20 66 65 74 63 68 20 74 68 65  umn to fetch the
3aa0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3ab0: 6e 73 65 72 74 65 64 20 72 6f 77 2e 20 20 54 68  nserted row.  Th
3ac0: 69 73 20 6d 61 79 0d 0a 20 20 20 20 20 20 20 20  is may..        
3ad0: 20 20 2f 2f 20 20 20 20 20 20 20 73 74 69 6c 6c    //       still
3ae0: 20 66 61 69 6c 20 69 66 20 74 68 65 20 74 61 62   fail if the tab
3af0: 6c 65 20 69 73 20 61 20 57 49 54 48 4f 55 54 20  le is a WITHOUT 
3b00: 52 4f 57 49 44 20 74 61 62 6c 65 20 2d 4f 52 2d  ROWID table -OR-
3b10: 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20  ..          //  
3b20: 20 20 20 20 20 73 6f 6d 65 74 68 69 6e 67 20 28       something (
3b30: 65 2e 67 2e 20 61 20 74 72 69 67 67 65 72 29 20  e.g. a trigger) 
3b40: 63 61 75 73 65 73 20 74 68 65 20 6c 61 73 74 5f  causes the last_
3b50: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 0d 0a  insert_rowid()..
3b60: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
3b70: 20 20 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72     function to r
3b80: 65 74 75 72 6e 20 61 6e 20 69 6e 63 6f 72 72 65  eturn an incorre
3b90: 63 74 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  ct result...    
3ba0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3bb0: 20 20 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e      commandText.
3bc0: 41 70 70 65 6e 64 28 22 20 41 4e 44 20 22 29 3b  Append(" AND ");
3bd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d  ..          comm
3be0: 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 28 53  andText.Append(S
3bf0: 71 6c 47 65 6e 65 72 61 74 6f 72 2e 51 75 6f 74  qlGenerator.Quot
3c00: 65 49 64 65 6e 74 69 66 69 65 72 28 22 72 6f 77  eIdentifier("row
3c10: 69 64 22 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  id"));..        
3c20: 20 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70    commandText.Ap
3c30: 70 65 6e 64 28 22 20 3d 20 22 29 3b 0d 0a 20 20  pend(" = ");..  
3c40: 20 20 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64 54          commandT
3c50: 65 78 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28 22  ext.AppendLine("
3c60: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
3c70: 64 28 29 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  d()");..      }.
3c80: 0a 20 20 20 20 20 20 65 6c 73 65 20 2f 2a 20 4e  .      else /* N
3c90: 4f 54 2d 52 45 41 43 48 45 44 3f 20 2a 2f 0d 0a  OT-REACHED? */..
3ca0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3cb0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
3cc0: 20 2f 2f 20 4e 4f 54 45 3a 20 57 65 20 63 61 6e   // NOTE: We can
3cd0: 6e 6f 74 20 73 69 6d 70 6c 79 20 75 73 65 20 74  not simply use t
3ce0: 68 65 20 22 72 6f 77 69 64 22 20 61 74 20 74 68  he "rowid" at th
3cf0: 69 73 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  is point because
3d00: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  :..          //.
3d10: 0a 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20  .          //   
3d20: 20 20 20 20 31 2e 20 54 68 65 20 6c 61 73 74 5f      1. The last_
3d30: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 66  insert_rowid() f
3d40: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
3d50: 76 61 6c 69 64 20 61 66 74 65 72 0d 0a 20 20 20  valid after..   
3d60: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
3d70: 20 20 20 61 6e 20 49 4e 53 45 52 54 20 61 6e 64     an INSERT and
3d80: 20 74 68 69 73 20 77 61 73 20 61 6e 20 55 50 44   this was an UPD
3d90: 41 54 45 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ATE...          
3da0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 74 68  //..          th
3db0: 72 6f 77 20 6e 65 77 20 4e 6f 74 53 75 70 70 6f  row new NotSuppo
3dc0: 72 74 65 64 45 78 63 65 70 74 69 6f 6e 28 53 74  rtedException(St
3dd0: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 69 73              "Mis
3df0: 73 69 6e 67 20 76 61 6c 75 65 20 66 6f 72 20 55  sing value for U
3e00: 50 44 41 54 45 20 6b 65 79 20 6d 65 6d 62 65 72  PDATE key member
3e10: 20 27 7b 30 7d 27 20 69 6e 20 74 61 62 6c 65 20   '{0}' in table 
3e20: 27 7b 31 7d 27 2e 22 2c 0d 0a 20 20 20 20 20 20  '{1}'.",..      
3e30: 20 20 20 20 20 20 20 20 20 28 6d 69 73 73 69 6e           (missin
3e40: 67 4b 65 79 4d 65 6d 62 65 72 20 21 3d 20 6e 75  gKeyMember != nu
3e50: 6c 6c 29 20 3f 20 6d 69 73 73 69 6e 67 4b 65 79  ll) ? missingKey
3e60: 4d 65 6d 62 65 72 2e 4e 61 6d 65 20 3a 20 22 3c  Member.Name : "<
3e70: 75 6e 6b 6e 6f 77 6e 3e 22 2c 0d 0a 20 20 20 20  unknown>",..    
3e80: 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
3e90: 2e 4e 61 6d 65 29 29 3b 0d 0a 20 20 20 20 20 20  .Name));..      
3ea0: 7d 0d 0a 20 20 20 20 20 20 63 6f 6d 6d 61 6e 64  }..      command
3eb0: 54 65 78 74 2e 41 70 70 65 6e 64 4c 69 6e 65 28  Text.AppendLine(
3ec0: 22 3b 22 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ";");..    }....
3ed0: 20 20 20 20 2f 2f 2f 20 3c 73 75 6d 6d 61 72 79      /// <summary
3ee0: 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4c 69 67 68 74  >..    /// Light
3ef0: 77 65 69 67 68 74 20 65 78 70 72 65 73 73 69 6f  weight expressio
3f00: 6e 20 74 72 61 6e 73 6c 61 74 6f 72 20 66 6f 72  n translator for
3f10: 20 44 4d 4c 20 65 78 70 72 65 73 73 69 6f 6e 20   DML expression 
3f20: 74 72 65 65 73 2c 20 77 68 69 63 68 20 68 61 76  trees, which hav
3f30: 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 0d 0a 20  e constrained.. 
3f40: 20 20 20 2f 2f 2f 20 73 63 6f 70 65 20 61 6e 64     /// scope and
3f50: 20 73 75 70 70 6f 72 74 2e 0d 0a 20 20 20 20 2f   support...    /
3f60: 2f 2f 20 3c 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20  // </summary>.. 
3f70: 20 20 20 70 72 69 76 61 74 65 20 63 6c 61 73 73     private class
3f80: 20 45 78 70 72 65 73 73 69 6f 6e 54 72 61 6e 73   ExpressionTrans
3f90: 6c 61 74 6f 72 20 3a 20 44 62 45 78 70 72 65 73  lator : DbExpres
3fa0: 73 69 6f 6e 56 69 73 69 74 6f 72 0d 0a 20 20 20  sionVisitor..   
3fb0: 20 7b 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73   {..      /// <s
3fc0: 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f  ummary>..      /
3fd0: 2f 2f 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  // Initialize a 
3fe0: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 74  new expression t
3ff0: 72 61 6e 73 6c 61 74 6f 72 20 70 6f 70 75 6c 61  ranslator popula
4000: 74 69 6e 67 20 74 68 65 20 67 69 76 65 6e 20 73  ting the given s
4010: 74 72 69 6e 67 20 62 75 69 6c 64 65 72 0d 0a 20  tring builder.. 
4020: 20 20 20 20 20 2f 2f 2f 20 77 69 74 68 20 63 6f       /// with co
4030: 6d 6d 61 6e 64 20 74 65 78 74 2e 20 43 6f 6d 6d  mmand text. Comm
4040: 61 6e 64 20 74 65 78 74 20 62 75 69 6c 64 65 72  and text builder
4050: 20 61 6e 64 20 63 6f 6d 6d 61 6e 64 20 74 72 65   and command tre
4060: 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75  e must not be nu
4070: 6c 6c 2e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  ll...      /// <
4080: 2f 73 75 6d 6d 61 72 79 3e 0d 0a 20 20 20 20 20  /summary>..     
4090: 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65   /// <param name
40a0: 3d 22 63 6f 6d 6d 61 6e 64 54 65 78 74 22 3e 43  ="commandText">C
40b0: 6f 6d 6d 61 6e 64 20 74 65 78 74 20 77 69 74 68  ommand text with
40c0: 20 77 68 69 63 68 20 74 6f 20 70 6f 70 75 6c 61   which to popula
40d0: 74 65 20 63 6f 6d 6d 61 6e 64 73 3c 2f 70 61 72  te commands</par
40e0: 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c  am>..      /// <
40f0: 70 61 72 61 6d 20 6e 61 6d 65 3d 22 63 6f 6d 6d  param name="comm
4100: 61 6e 64 54 72 65 65 22 3e 43 6f 6d 6d 61 6e 64  andTree">Command
4110: 20 74 72 65 65 20 67 65 6e 65 72 61 74 69 6e 67   tree generating
4120: 20 53 51 4c 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20   SQL</param>..  
4130: 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20 6e      /// <param n
4140: 61 6d 65 3d 22 70 72 65 73 65 72 76 65 4d 65 6d  ame="preserveMem
4150: 62 65 72 56 61 6c 75 65 73 22 3e 49 6e 64 69 63  berValues">Indic
4160: 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68 65  ates whether the
4170: 20 74 72 61 6e 73 6c 61 74 6f 72 20 73 68 6f 75   translator shou
4180: 6c 64 20 70 72 65 73 65 72 76 65 0d 0a 20 20 20  ld preserve..   
4190: 20 20 20 2f 2f 2f 20 6d 65 6d 62 65 72 20 76 61     /// member va
41a0: 6c 75 65 73 20 77 68 69 6c 65 20 63 6f 6d 70 69  lues while compi
41b0: 6c 69 6e 67 20 74 2d 53 51 4c 20 28 6f 6e 6c 79  ling t-SQL (only
41c0: 20 6e 65 65 64 65 64 20 66 6f 72 20 73 65 72 76   needed for serv
41d0: 65 72 20 67 65 6e 65 72 61 74 69 6f 6e 29 3c 2f  er generation)</
41e0: 70 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 2f 2f  param>..      //
41f0: 2f 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 6b  / <param name="k
4200: 69 6e 64 22 3e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ind"></param>.. 
4210: 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 45 78       internal Ex
4220: 70 72 65 73 73 69 6f 6e 54 72 61 6e 73 6c 61 74  pressionTranslat
4230: 6f 72 28 53 74 72 69 6e 67 42 75 69 6c 64 65 72  or(StringBuilder
4240: 20 63 6f 6d 6d 61 6e 64 54 65 78 74 2c 20 44 62   commandText, Db
4250: 4d 6f 64 69 66 69 63 61 74 69 6f 6e 43 6f 6d 6d  ModificationComm
4260: 61 6e 64 54 72 65 65 20 63 6f 6d 6d 61 6e 64 54  andTree commandT
4270: 72 65 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ree,..          
4280: 62 6f 6f 6c 20 70 72 65 73 65 72 76 65 4d 65 6d  bool preserveMem
4290: 62 65 72 56 61 6c 75 65 73 2c 20 73 74 72 69 6e  berValues, strin
42a0: 67 20 6b 69 6e 64 29 0d 0a 20 20 20 20 20 20 7b  g kind)..      {
42b0: 0d 0a 20 20 20 20 20 20 20 20 44 65 62 75 67 2e  ..        Debug.
42c0: 41 73 73 65 72 74 28 6e 75 6c 6c 20 21 3d 20 63  Assert(null != c
42d0: 6f 6d 6d 61 6e 64 54 65 78 74 29 3b 0d 0a 20 20  ommandText);..  
42e0: 20 20 20 20 20 20 44 65 62 75 67 2e 41 73 73 65        Debug.Asse
42f0: 72 74 28 6e 75 6c 6c 20 21 3d 20 63 6f 6d 6d 61  rt(null != comma
4300: 6e 64 54 72 65 65 29 3b 0d 0a 20 20 20 20 20 20  ndTree);..      
4310: 20 20 5f 6b 69 6e 64 20 3d 20 6b 69 6e 64 3b 0d    _kind = kind;.
4320: 0a 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e  .        _comman
4330: 64 54 65 78 74 20 3d 20 63 6f 6d 6d 61 6e 64 54  dText = commandT
4340: 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 5f 63  ext;..        _c
4350: 6f 6d 6d 61 6e 64 54 72 65 65 20 3d 20 63 6f 6d  ommandTree = com
4360: 6d 61 6e 64 54 72 65 65 3b 0d 0a 20 20 20 20 20  mandTree;..     
4370: 20 20 20 5f 70 61 72 61 6d 65 74 65 72 73 20 3d     _parameters =
4380: 20 6e 65 77 20 4c 69 73 74 3c 44 62 50 61 72 61   new List<DbPara
4390: 6d 65 74 65 72 3e 28 29 3b 0d 0a 20 20 20 20 20  meter>();..     
43a0: 20 20 20 5f 6d 65 6d 62 65 72 56 61 6c 75 65 73     _memberValues
43b0: 20 3d 20 70 72 65 73 65 72 76 65 4d 65 6d 62 65   = preserveMembe
43c0: 72 56 61 6c 75 65 73 20 3f 20 6e 65 77 20 44 69  rValues ? new Di
43d0: 63 74 69 6f 6e 61 72 79 3c 45 64 6d 4d 65 6d 62  ctionary<EdmMemb
43e0: 65 72 2c 20 44 62 50 61 72 61 6d 65 74 65 72 3e  er, DbParameter>
43f0: 28 29 20 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  () :..          
4400: 20 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 7d    null;..      }
4410: 0d 0a 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74  ....      privat
4420: 65 20 72 65 61 64 6f 6e 6c 79 20 53 74 72 69 6e  e readonly Strin
4430: 67 42 75 69 6c 64 65 72 20 5f 63 6f 6d 6d 61 6e  gBuilder _comman
4440: 64 54 65 78 74 3b 0d 0a 20 20 20 20 20 20 70 72  dText;..      pr
4450: 69 76 61 74 65 20 72 65 61 64 6f 6e 6c 79 20 44  ivate readonly D
4460: 62 4d 6f 64 69 66 69 63 61 74 69 6f 6e 43 6f 6d  bModificationCom
4470: 6d 61 6e 64 54 72 65 65 20 5f 63 6f 6d 6d 61 6e  mandTree _comman
4480: 64 54 72 65 65 3b 0d 0a 20 20 20 20 20 20 70 72  dTree;..      pr
4490: 69 76 61 74 65 20 72 65 61 64 6f 6e 6c 79 20 4c  ivate readonly L
44a0: 69 73 74 3c 44 62 50 61 72 61 6d 65 74 65 72 3e  ist<DbParameter>
44b0: 20 5f 70 61 72 61 6d 65 74 65 72 73 3b 0d 0a 20   _parameters;.. 
44c0: 20 20 20 20 20 70 72 69 76 61 74 65 20 72 65 61       private rea
44d0: 64 6f 6e 6c 79 20 44 69 63 74 69 6f 6e 61 72 79  donly Dictionary
44e0: 3c 45 64 6d 4d 65 6d 62 65 72 2c 20 44 62 50 61  <EdmMember, DbPa
44f0: 72 61 6d 65 74 65 72 3e 20 5f 6d 65 6d 62 65 72  rameter> _member
4500: 56 61 6c 75 65 73 3b 0d 0a 20 20 20 20 20 20 70  Values;..      p
4510: 72 69 76 61 74 65 20 69 6e 74 20 70 61 72 61 6d  rivate int param
4520: 65 74 65 72 4e 61 6d 65 43 6f 75 6e 74 20 3d 20  eterNameCount = 
4530: 30 3b 0d 0a 20 20 20 20 20 20 70 72 69 76 61 74  0;..      privat
4540: 65 20 73 74 72 69 6e 67 20 5f 6b 69 6e 64 3b 0d  e string _kind;.
4550: 0a 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61  ...      interna
4560: 6c 20 4c 69 73 74 3c 44 62 50 61 72 61 6d 65 74  l List<DbParamet
4570: 65 72 3e 20 50 61 72 61 6d 65 74 65 72 73 20 7b  er> Parameters {
4580: 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 5f 70   get { return _p
4590: 61 72 61 6d 65 74 65 72 73 3b 20 7d 20 7d 0d 0a  arameters; } }..
45a0: 20 20 20 20 20 20 69 6e 74 65 72 6e 61 6c 20 44        internal D
45b0: 69 63 74 69 6f 6e 61 72 79 3c 45 64 6d 4d 65 6d  ictionary<EdmMem
45c0: 62 65 72 2c 20 44 62 50 61 72 61 6d 65 74 65 72  ber, DbParameter
45d0: 3e 20 4d 65 6d 62 65 72 56 61 6c 75 65 73 20 7b  > MemberValues {
45e0: 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 5f 6d   get { return _m
45f0: 65 6d 62 65 72 56 61 6c 75 65 73 3b 20 7d 20 7d  emberValues; } }
4600: 0d 0a 0d 0a 20 20 20 20 20 20 2f 2f 20 67 65 6e  ....      // gen
4610: 65 72 61 74 65 20 70 61 72 61 6d 65 74 65 72 20  erate parameter 
4620: 28 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 70  (name based on p
4630: 61 72 61 6d 65 74 65 72 20 6f 72 64 69 6e 61 6c  arameter ordinal
4640: 29 0d 0a 20 20 20 20 20 20 69 6e 74 65 72 6e 61  )..      interna
4650: 6c 20 53 51 4c 69 74 65 50 61 72 61 6d 65 74 65  l SQLiteParamete
4660: 72 20 43 72 65 61 74 65 50 61 72 61 6d 65 74 65  r CreateParamete
4670: 72 28 6f 62 6a 65 63 74 20 76 61 6c 75 65 2c 20  r(object value, 
4680: 54 79 70 65 55 73 61 67 65 20 74 79 70 65 29 0d  TypeUsage type).
4690: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
46a0: 20 20 50 72 69 6d 69 74 69 76 65 54 79 70 65 4b    PrimitiveTypeK
46b0: 69 6e 64 20 70 72 69 6d 69 74 69 76 65 54 79 70  ind primitiveTyp
46c0: 65 20 3d 20 4d 65 74 61 64 61 74 61 48 65 6c 70  e = MetadataHelp
46d0: 65 72 73 2e 47 65 74 50 72 69 6d 69 74 69 76 65  ers.GetPrimitive
46e0: 54 79 70 65 4b 69 6e 64 28 74 79 70 65 29 3b 0d  TypeKind(type);.
46f0: 0a 20 20 20 20 20 20 20 20 44 62 54 79 70 65 20  .        DbType 
4700: 64 62 54 79 70 65 20 3d 20 4d 65 74 61 64 61 74  dbType = Metadat
4710: 61 48 65 6c 70 65 72 73 2e 47 65 74 44 62 54 79  aHelpers.GetDbTy
4720: 70 65 28 70 72 69 6d 69 74 69 76 65 54 79 70 65  pe(primitiveType
4730: 29 3b 0d 0a 20 20 20 20 20 20 20 20 72 65 74 75  );..        retu
4740: 72 6e 20 43 72 65 61 74 65 50 61 72 61 6d 65 74  rn CreateParamet
4750: 65 72 28 76 61 6c 75 65 2c 20 64 62 54 79 70 65  er(value, dbType
4760: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  );..      }.... 
4770: 20 20 20 20 20 2f 2f 20 43 72 65 61 74 65 73 20       // Creates 
4780: 61 20 6e 65 77 20 70 61 72 61 6d 65 74 65 72 20  a new parameter 
4790: 66 6f 72 20 61 20 76 61 6c 75 65 20 69 6e 20 74  for a value in t
47a0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 74  his expression t
47b0: 72 61 6e 73 6c 61 74 6f 72 0d 0a 20 20 20 20 20  ranslator..     
47c0: 20 69 6e 74 65 72 6e 61 6c 20 53 51 4c 69 74 65   internal SQLite
47d0: 50 61 72 61 6d 65 74 65 72 20 43 72 65 61 74 65  Parameter Create
47e0: 50 61 72 61 6d 65 74 65 72 28 6f 62 6a 65 63 74  Parameter(object
47f0: 20 76 61 6c 75 65 2c 20 44 62 54 79 70 65 20 64   value, DbType d
4800: 62 54 79 70 65 29 0d 0a 20 20 20 20 20 20 7b 0d  bType)..      {.
4810: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20  .        string 
4820: 70 61 72 61 6d 65 74 65 72 4e 61 6d 65 20 3d 20  parameterName = 
4830: 73 74 72 69 6e 67 2e 43 6f 6e 63 61 74 28 22 40  string.Concat("@
4840: 70 22 2c 20 70 61 72 61 6d 65 74 65 72 4e 61 6d  p", parameterNam
4850: 65 43 6f 75 6e 74 2e 54 6f 53 74 72 69 6e 67 28  eCount.ToString(
4860: 43 75 6c 74 75 72 65 49 6e 66 6f 2e 49 6e 76 61  CultureInfo.Inva
4870: 72 69 61 6e 74 43 75 6c 74 75 72 65 29 29 3b 0d  riantCulture));.
4880: 0a 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74  .        paramet
4890: 65 72 4e 61 6d 65 43 6f 75 6e 74 2b 2b 3b 0d 0a  erNameCount++;..
48a0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 50 61          SQLitePa
48b0: 72 61 6d 65 74 65 72 20 70 61 72 61 6d 65 74 65  rameter paramete
48c0: 72 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 50 61  r = new SQLitePa
48d0: 72 61 6d 65 74 65 72 28 70 61 72 61 6d 65 74 65  rameter(paramete
48e0: 72 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0d 0a  rName, value);..
48f0: 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65          paramete
4900: 72 2e 44 62 54 79 70 65 20 3d 20 64 62 54 79 70  r.DbType = dbTyp
4910: 65 3b 0d 0a 20 20 20 20 20 20 20 20 5f 70 61 72  e;..        _par
4920: 61 6d 65 74 65 72 73 2e 41 64 64 28 70 61 72 61  ameters.Add(para
4930: 6d 65 74 65 72 29 3b 0d 0a 20 20 20 20 20 20 20  meter);..       
4940: 20 72 65 74 75 72 6e 20 70 61 72 61 6d 65 74 65   return paramete
4950: 72 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  r;..      }.... 
4960: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 42 61 73       #region Bas
4970: 69 63 73 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62  ics....      pub
4980: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69  lic override voi
4990: 64 20 56 69 73 69 74 28 44 62 41 70 70 6c 79 45  d Visit(DbApplyE
49a0: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
49b0: 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  sion)..      {..
49c0: 20 20 20 20 20 20 20 20 69 66 20 28 65 78 70 72          if (expr
49d0: 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20  ession == null) 
49e0: 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65  throw new Argume
49f0: 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 65 78 70  ntException("exp
4a00: 72 65 73 73 69 6f 6e 22 29 3b 0d 0a 0d 0a 20 20  ression");....  
4a10: 20 20 20 20 20 20 56 69 73 69 74 45 78 70 72 65        VisitExpre
4a20: 73 73 69 6f 6e 42 69 6e 64 69 6e 67 50 72 65 28  ssionBindingPre(
4a30: 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74  expression.Input
4a40: 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28  );..        if (
4a50: 65 78 70 72 65 73 73 69 6f 6e 2e 41 70 70 6c 79  expression.Apply
4a60: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
4a70: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4a80: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28  VisitExpression(
4a90: 65 78 70 72 65 73 73 69 6f 6e 2e 41 70 70 6c 79  expression.Apply
4aa0: 2e 45 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20  .Expression);.. 
4ab0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
4ac0: 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f    VisitExpressio
4ad0: 6e 42 69 6e 64 69 6e 67 50 6f 73 74 28 65 78 70  nBindingPost(exp
4ae0: 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74 29 3b 0d  ression.Input);.
4af0: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
4b00: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
4b10: 65 20 76 6f 69 64 20 56 69 73 69 74 28 44 62 41  e void Visit(DbA
4b20: 72 69 74 68 6d 65 74 69 63 45 78 70 72 65 73 73  rithmeticExpress
4b30: 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d  ion expression).
4b40: 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  .      {..      
4b50: 20 20 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e    if (expression
4b60: 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72 6f 77 20   == null) throw 
4b70: 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65  new ArgumentExce
4b80: 70 74 69 6f 6e 28 22 65 78 70 72 65 73 73 69 6f  ption("expressio
4b90: 6e 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69  n");..        Vi
4ba0: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 4c 69 73  sitExpressionLis
4bb0: 74 28 65 78 70 72 65 73 73 69 6f 6e 2e 41 72 67  t(expression.Arg
4bc0: 75 6d 65 6e 74 73 29 3b 0d 0a 20 20 20 20 20 20  uments);..      
4bd0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69  }....      publi
4be0: 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  c override void 
4bf0: 56 69 73 69 74 28 44 62 43 61 73 65 45 78 70 72  Visit(DbCaseExpr
4c00: 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ession expressio
4c10: 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  n)..      {..   
4c20: 20 20 20 20 20 69 66 20 28 65 78 70 72 65 73 73       if (express
4c30: 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72  ion == null) thr
4c40: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45  ow new ArgumentE
4c50: 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72 65 73  xception("expres
4c60: 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 20 20 20  sion");..       
4c70: 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e   VisitExpression
4c80: 4c 69 73 74 28 65 78 70 72 65 73 73 69 6f 6e 2e  List(expression.
4c90: 57 68 65 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20  When);..        
4ca0: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 4c  VisitExpressionL
4cb0: 69 73 74 28 65 78 70 72 65 73 73 69 6f 6e 2e 54  ist(expression.T
4cc0: 68 65 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 56  hen);..        V
4cd0: 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28 65  isitExpression(e
4ce0: 78 70 72 65 73 73 69 6f 6e 2e 45 6c 73 65 29 3b  xpression.Else);
4cf0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
4d00: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
4d10: 64 65 20 76 6f 69 64 20 56 69 73 69 74 28 44 62  de void Visit(Db
4d20: 43 61 73 74 45 78 70 72 65 73 73 69 6f 6e 20 65  CastExpression e
4d30: 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
4d40: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 56 69 73    {..        Vis
4d50: 69 74 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f  itUnaryExpressio
4d60: 6e 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a  n(expression);..
4d70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4d80: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
4d90: 20 76 6f 69 64 20 56 69 73 69 74 28 44 62 43 72   void Visit(DbCr
4da0: 6f 73 73 4a 6f 69 6e 45 78 70 72 65 73 73 69 6f  ossJoinExpressio
4db0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20  n expression).. 
4dc0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4dd0: 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e 20 3d  if (expression =
4de0: 3d 20 6e 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65  = null) throw ne
4df0: 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74  w ArgumentExcept
4e00: 69 6f 6e 28 22 65 78 70 72 65 73 73 69 6f 6e 22  ion("expression"
4e10: 29 3b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 65  );..        fore
4e20: 61 63 68 20 28 44 62 45 78 70 72 65 73 73 69 6f  ach (DbExpressio
4e30: 6e 42 69 6e 64 69 6e 67 20 62 69 6e 64 69 6e 67  nBinding binding
4e40: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 49   in expression.I
4e50: 6e 70 75 74 73 29 0d 0a 20 20 20 20 20 20 20 20  nputs)..        
4e60: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 56 69 73  {..          Vis
4e70: 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64  itExpressionBind
4e80: 69 6e 67 50 72 65 28 62 69 6e 64 69 6e 67 29 3b  ingPre(binding);
4e90: 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
4ea0: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 44 62       foreach (Db
4eb0: 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e  ExpressionBindin
4ec0: 67 20 62 69 6e 64 69 6e 67 32 20 69 6e 20 65 78  g binding2 in ex
4ed0: 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74 73 29  pression.Inputs)
4ee0: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
4ef0: 20 20 20 20 20 20 20 56 69 73 69 74 45 78 70 72         VisitExpr
4f00: 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 50 6f 73  essionBindingPos
4f10: 74 28 62 69 6e 64 69 6e 67 32 29 3b 0d 0a 20 20  t(binding2);..  
4f20: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d        }..      }
4f30: 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63  ....      public
4f40: 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 56   override void V
4f50: 69 73 69 74 28 44 62 44 65 72 65 66 45 78 70 72  isit(DbDerefExpr
4f60: 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ession expressio
4f70: 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  n)..      {..   
4f80: 20 20 20 20 20 56 69 73 69 74 55 6e 61 72 79 45       VisitUnaryE
4f90: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
4fa0: 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  sion);..      }.
4fb0: 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20  ...      public 
4fc0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 56 69  override void Vi
4fd0: 73 69 74 28 44 62 44 69 73 74 69 6e 63 74 45 78  sit(DbDistinctEx
4fe0: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
4ff0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ion)..      {.. 
5000: 20 20 20 20 20 20 20 56 69 73 69 74 55 6e 61 72         VisitUnar
5010: 79 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72  yExpression(expr
5020: 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  ession);..      
5030: 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69  }....      publi
5040: 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  c override void 
5050: 56 69 73 69 74 28 44 62 45 6c 65 6d 65 6e 74 45  Visit(DbElementE
5060: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
5070: 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  sion)..      {..
5080: 20 20 20 20 20 20 20 20 56 69 73 69 74 55 6e 61          VisitUna
5090: 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70  ryExpression(exp
50a0: 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20  ression);..     
50b0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c   }....      publ
50c0: 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ic override void
50d0: 20 56 69 73 69 74 28 44 62 45 6e 74 69 74 79 52   Visit(DbEntityR
50e0: 65 66 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70  efExpression exp
50f0: 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ression)..      
5100: 7b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  {..        Visit
5110: 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28  UnaryExpression(
5120: 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20  expression);..  
5130: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70      }....      p
5140: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76  ublic override v
5150: 6f 69 64 20 56 69 73 69 74 28 44 62 45 78 63 65  oid Visit(DbExce
5160: 70 74 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70  ptExpression exp
5170: 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ression)..      
5180: 7b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  {..        Visit
5190: 42 69 6e 61 72 79 28 65 78 70 72 65 73 73 69 6f  Binary(expressio
51a0: 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  n);..      }....
51b0: 20 20 20 20 20 20 70 72 6f 74 65 63 74 65 64 20        protected 
51c0: 76 69 72 74 75 61 6c 20 76 6f 69 64 20 56 69 73  virtual void Vis
51d0: 69 74 42 69 6e 61 72 79 28 44 62 42 69 6e 61 72  itBinary(DbBinar
51e0: 79 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  yExpression expr
51f0: 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b  ession)..      {
5200: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 78  ..        if (ex
5210: 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c  pression == null
5220: 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75  ) throw new Argu
5230: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 65  mentException("e
5240: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0d 0a 20 20  xpression");..  
5250: 20 20 20 20 20 20 74 68 69 73 2e 56 69 73 69 74        this.Visit
5260: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
5270: 73 73 69 6f 6e 2e 4c 65 66 74 29 3b 0d 0a 20 20  ssion.Left);..  
5280: 20 20 20 20 20 20 74 68 69 73 2e 56 69 73 69 74        this.Visit
5290: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
52a0: 73 73 69 6f 6e 2e 52 69 67 68 74 29 3b 0d 0a 20  ssion.Right);.. 
52b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
52c0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
52d0: 76 6f 69 64 20 56 69 73 69 74 28 44 62 45 78 70  void Visit(DbExp
52e0: 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
52f0: 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  on)..      {..  
5300: 20 20 20 20 20 20 69 66 20 28 65 78 70 72 65 73        if (expres
5310: 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74 68  sion == null) th
5320: 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74  row new Argument
5330: 45 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72 65  Exception("expre
5340: 73 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 20 20  ssion");..      
5350: 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f 74 53    throw new NotS
5360: 75 70 70 6f 72 74 65 64 45 78 63 65 70 74 69 6f  upportedExceptio
5370: 6e 28 22 44 62 45 78 70 72 65 73 73 69 6f 6e 22  n("DbExpression"
5380: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  );..      }.... 
5390: 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72       public over
53a0: 72 69 64 65 20 76 6f 69 64 20 56 69 73 69 74 28  ride void Visit(
53b0: 44 62 46 69 6c 74 65 72 45 78 70 72 65 73 73 69  DbFilterExpressi
53c0: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a  on expression)..
53d0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
53e0: 20 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e 20   if (expression 
53f0: 3d 3d 20 6e 75 6c 6c 29 20 74 68 72 6f 77 20 6e  == null) throw n
5400: 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70  ew ArgumentExcep
5410: 74 69 6f 6e 28 22 65 78 70 72 65 73 73 69 6f 6e  tion("expression
5420: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73  ");..        Vis
5430: 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64  itExpressionBind
5440: 69 6e 67 50 72 65 28 65 78 70 72 65 73 73 69 6f  ingPre(expressio
5450: 6e 2e 49 6e 70 75 74 29 3b 0d 0a 20 20 20 20 20  n.Input);..     
5460: 20 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69     VisitExpressi
5470: 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e 2e 50 72  on(expression.Pr
5480: 65 64 69 63 61 74 65 29 3b 0d 0a 20 20 20 20 20  edicate);..     
5490: 20 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69     VisitExpressi
54a0: 6f 6e 42 69 6e 64 69 6e 67 50 6f 73 74 28 65 78  onBindingPost(ex
54b0: 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74 29 3b  pression.Input);
54c0: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
54d0: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
54e0: 64 65 20 76 6f 69 64 20 56 69 73 69 74 28 44 62  de void Visit(Db
54f0: 46 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69  FunctionExpressi
5500: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a  on expression)..
5510: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5520: 20 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e 20   if (expression 
5530: 3d 3d 20 6e 75 6c 6c 29 20 74 68 72 6f 77 20 6e  == null) throw n
5540: 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70  ew ArgumentExcep
5550: 74 69 6f 6e 28 22 65 78 70 72 65 73 73 69 6f 6e  tion("expression
5560: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73  ");..        Vis
5570: 69 74 45 78 70 72 65 73 73 69 6f 6e 4c 69 73 74  itExpressionList
5580: 28 65 78 70 72 65 73 73 69 6f 6e 2e 41 72 67 75  (expression.Argu
5590: 6d 65 6e 74 73 29 3b 0d 0a 20 20 20 20 20 20 20  ments);..       
55a0: 20 2f 2f 69 66 20 28 65 78 70 72 65 73 73 69 6f   //if (expressio
55b0: 6e 2e 49 73 4c 61 6d 62 64 61 29 0d 0a 20 20 20  n.IsLambda)..   
55c0: 20 20 20 20 20 2f 2f 7b 0d 0a 20 20 20 20 20 20       //{..      
55d0: 20 20 2f 2f 20 20 56 69 73 69 74 4c 61 6d 62 64    //  VisitLambd
55e0: 61 46 75 6e 63 74 69 6f 6e 50 72 65 28 65 78 70  aFunctionPre(exp
55f0: 72 65 73 73 69 6f 6e 2e 46 75 6e 63 74 69 6f 6e  ression.Function
5600: 2c 20 65 78 70 72 65 73 73 69 6f 6e 2e 4c 61 6d  , expression.Lam
5610: 62 64 61 42 6f 64 79 29 3b 0d 0a 20 20 20 20 20  bdaBody);..     
5620: 20 20 20 2f 2f 20 20 56 69 73 69 74 45 78 70 72     //  VisitExpr
5630: 65 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f  ession(expressio
5640: 6e 2e 4c 61 6d 62 64 61 42 6f 64 79 29 3b 0d 0a  n.LambdaBody);..
5650: 20 20 20 20 20 20 20 20 2f 2f 20 20 56 69 73 69          //  Visi
5660: 74 4c 61 6d 62 64 61 46 75 6e 63 74 69 6f 6e 50  tLambdaFunctionP
5670: 6f 73 74 28 65 78 70 72 65 73 73 69 6f 6e 2e 46  ost(expression.F
5680: 75 6e 63 74 69 6f 6e 2c 20 65 78 70 72 65 73 73  unction, express
5690: 69 6f 6e 2e 4c 61 6d 62 64 61 42 6f 64 79 29 3b  ion.LambdaBody);
56a0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 7d 0d 0a 20  ..        //}.. 
56b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
56c0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
56d0: 76 6f 69 64 20 56 69 73 69 74 28 44 62 47 72 6f  void Visit(DbGro
56e0: 75 70 42 79 45 78 70 72 65 73 73 69 6f 6e 20 65  upByExpression e
56f0: 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
5700: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20    {..        if 
5710: 28 65 78 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e  (expression == n
5720: 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77 20 41  ull) throw new A
5730: 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e  rgumentException
5740: 28 22 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0d  ("expression");.
5750: 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 47 72  .        VisitGr
5760: 6f 75 70 45 78 70 72 65 73 73 69 6f 6e 42 69 6e  oupExpressionBin
5770: 64 69 6e 67 50 72 65 28 65 78 70 72 65 73 73 69  dingPre(expressi
5780: 6f 6e 2e 49 6e 70 75 74 29 3b 0d 0a 20 20 20 20  on.Input);..    
5790: 20 20 20 20 56 69 73 69 74 45 78 70 72 65 73 73      VisitExpress
57a0: 69 6f 6e 4c 69 73 74 28 65 78 70 72 65 73 73 69  ionList(expressi
57b0: 6f 6e 2e 4b 65 79 73 29 3b 0d 0a 20 20 20 20 20  on.Keys);..     
57c0: 20 20 20 56 69 73 69 74 47 72 6f 75 70 45 78 70     VisitGroupExp
57d0: 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 4d 69  ressionBindingMi
57e0: 64 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70  d(expression.Inp
57f0: 75 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69  ut);..        Vi
5800: 73 69 74 41 67 67 72 65 67 61 74 65 4c 69 73 74  sitAggregateList
5810: 28 65 78 70 72 65 73 73 69 6f 6e 2e 41 67 67 72  (expression.Aggr
5820: 65 67 61 74 65 73 29 3b 0d 0a 20 20 20 20 20 20  egates);..      
5830: 20 20 56 69 73 69 74 47 72 6f 75 70 45 78 70 72    VisitGroupExpr
5840: 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 50 6f 73  essionBindingPos
5850: 74 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70  t(expression.Inp
5860: 75 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  ut);..      }...
5870: 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76  .      public ov
5880: 65 72 72 69 64 65 20 76 6f 69 64 20 56 69 73 69  erride void Visi
5890: 74 28 44 62 49 6e 74 65 72 73 65 63 74 45 78 70  t(DbIntersectExp
58a0: 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
58b0: 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  on)..      {..  
58c0: 20 20 20 20 20 20 56 69 73 69 74 42 69 6e 61 72        VisitBinar
58d0: 79 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a  y(expression);..
58e0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
58f0: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
5900: 20 76 6f 69 64 20 56 69 73 69 74 28 44 62 49 73   void Visit(DbIs
5910: 45 6d 70 74 79 45 78 70 72 65 73 73 69 6f 6e 20  EmptyExpression 
5920: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
5930: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 56 69     {..        Vi
5940: 73 69 74 55 6e 61 72 79 45 78 70 72 65 73 73 69  sitUnaryExpressi
5950: 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d  on(expression);.
5960: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
5970: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
5980: 65 20 76 6f 69 64 20 56 69 73 69 74 28 44 62 49  e void Visit(DbI
5990: 73 4f 66 45 78 70 72 65 73 73 69 6f 6e 20 65 78  sOfExpression ex
59a0: 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20  pression)..     
59b0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69   {..        Visi
59c0: 74 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e  tUnaryExpression
59d0: 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20  (expression);.. 
59e0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
59f0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
5a00: 76 6f 69 64 20 56 69 73 69 74 28 44 62 4a 6f 69  void Visit(DbJoi
5a10: 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  nExpression expr
5a20: 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b  ession)..      {
5a30: 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 78  ..        if (ex
5a40: 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c  pression == null
5a50: 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75  ) throw new Argu
5a60: 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 65  mentException("e
5a70: 78 70 72 65 73 73 69 6f 6e 22 29 3b 0d 0a 20 20  xpression");..  
5a80: 20 20 20 20 20 20 56 69 73 69 74 45 78 70 72 65        VisitExpre
5a90: 73 73 69 6f 6e 42 69 6e 64 69 6e 67 50 72 65 28  ssionBindingPre(
5aa0: 65 78 70 72 65 73 73 69 6f 6e 2e 4c 65 66 74 29  expression.Left)
5ab0: 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  ;..        Visit
5ac0: 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e  ExpressionBindin
5ad0: 67 50 72 65 28 65 78 70 72 65 73 73 69 6f 6e 2e  gPre(expression.
5ae0: 52 69 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 20  Right);..       
5af0: 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e   VisitExpression
5b00: 28 65 78 70 72 65 73 73 69 6f 6e 2e 4a 6f 69 6e  (expression.Join
5b10: 43 6f 6e 64 69 74 69 6f 6e 29 3b 0d 0a 20 20 20  Condition);..   
5b20: 20 20 20 20 20 56 69 73 69 74 45 78 70 72 65 73       VisitExpres
5b30: 73 69 6f 6e 42 69 6e 64 69 6e 67 50 6f 73 74 28  sionBindingPost(
5b40: 65 78 70 72 65 73 73 69 6f 6e 2e 4c 65 66 74 29  expression.Left)
5b50: 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  ;..        Visit
5b60: 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e  ExpressionBindin
5b70: 67 50 6f 73 74 28 65 78 70 72 65 73 73 69 6f 6e  gPost(expression
5b80: 2e 52 69 67 68 74 29 3b 0d 0a 20 20 20 20 20 20  .Right);..      
5b90: 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69  }....      publi
5ba0: 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  c override void 
5bb0: 56 69 73 69 74 28 44 62 4c 69 6b 65 45 78 70 72  Visit(DbLikeExpr
5bc0: 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ession expressio
5bd0: 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  n)..      {..   
5be0: 20 20 20 20 20 69 66 20 28 65 78 70 72 65 73 73       if (express
5bf0: 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72  ion == null) thr
5c00: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45  ow new ArgumentE
5c10: 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72 65 73  xception("expres
5c20: 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 20 20 20  sion");..       
5c30: 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e   VisitExpression
5c40: 28 65 78 70 72 65 73 73 69 6f 6e 2e 41 72 67 75  (expression.Argu
5c50: 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20  ment);..        
5c60: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28  VisitExpression(
5c70: 65 78 70 72 65 73 73 69 6f 6e 2e 50 61 74 74 65  expression.Patte
5c80: 72 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69  rn);..        Vi
5c90: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28 65 78  sitExpression(ex
5ca0: 70 72 65 73 73 69 6f 6e 2e 45 73 63 61 70 65 29  pression.Escape)
5cb0: 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  ;..      }....  
5cc0: 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72      public overr
5cd0: 69 64 65 20 76 6f 69 64 20 56 69 73 69 74 28 44  ide void Visit(D
5ce0: 62 4c 69 6d 69 74 45 78 70 72 65 73 73 69 6f 6e  bLimitExpression
5cf0: 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20   expression)..  
5d00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69      {..        i
5d10: 66 20 28 65 78 70 72 65 73 73 69 6f 6e 20 3d 3d  f (expression ==
5d20: 20 6e 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77   null) throw new
5d30: 20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69   ArgumentExcepti
5d40: 6f 6e 28 22 65 78 70 72 65 73 73 69 6f 6e 22 29  on("expression")
5d50: 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  ;..        Visit
5d60: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
5d70: 73 73 69 6f 6e 2e 41 72 67 75 6d 65 6e 74 29 3b  ssion.Argument);
5d80: 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 45  ..        VisitE
5d90: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
5da0: 73 69 6f 6e 2e 4c 69 6d 69 74 29 3b 0d 0a 20 20  sion.Limit);..  
5db0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70      }....      p
5dc0: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76  ublic override v
5dd0: 6f 69 64 20 56 69 73 69 74 28 44 62 4f 66 54 79  oid Visit(DbOfTy
5de0: 70 65 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70  peExpression exp
5df0: 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ression)..      
5e00: 7b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  {..        Visit
5e10: 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28  UnaryExpression(
5e20: 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20  expression);..  
5e30: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70      }....      p
5e40: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76  ublic override v
5e50: 6f 69 64 20 56 69 73 69 74 28 44 62 50 61 72 61  oid Visit(DbPara
5e60: 6d 65 74 65 72 52 65 66 65 72 65 6e 63 65 45 78  meterReferenceEx
5e70: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
5e80: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ion)..      {.. 
5e90: 20 20 20 20 20 20 20 69 66 20 28 65 78 70 72 65         if (expre
5ea0: 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74  ssion == null) t
5eb0: 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e  hrow new Argumen
5ec0: 74 45 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72  tException("expr
5ed0: 65 73 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 20  ession");..     
5ee0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c   }....      publ
5ef0: 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ic override void
5f00: 20 56 69 73 69 74 28 44 62 50 72 6f 6a 65 63 74   Visit(DbProject
5f10: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
5f20: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d  ssion)..      {.
5f30: 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 78 70  .        if (exp
5f40: 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29  ression == null)
5f50: 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d   throw new Argum
5f60: 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 65 78  entException("ex
5f70: 70 72 65 73 73 69 6f 6e 22 29 3b 0d 0a 20 20 20  pression");..   
5f80: 20 20 20 20 20 56 69 73 69 74 45 78 70 72 65 73       VisitExpres
5f90: 73 69 6f 6e 42 69 6e 64 69 6e 67 50 72 65 28 65  sionBindingPre(e
5fa0: 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74 29  xpression.Input)
5fb0: 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74  ;..        Visit
5fc0: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
5fd0: 73 73 69 6f 6e 2e 50 72 6f 6a 65 63 74 69 6f 6e  ssion.Projection
5fe0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69  );..        Visi
5ff0: 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69  tExpressionBindi
6000: 6e 67 50 6f 73 74 28 65 78 70 72 65 73 73 69 6f  ngPost(expressio
6010: 6e 2e 49 6e 70 75 74 29 3b 0d 0a 20 20 20 20 20  n.Input);..     
6020: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c   }....      publ
6030: 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64  ic override void
6040: 20 56 69 73 69 74 28 44 62 51 75 61 6e 74 69 66   Visit(DbQuantif
6050: 69 65 72 45 78 70 72 65 73 73 69 6f 6e 20 65 78  ierExpression ex
6060: 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20  pression)..     
6070: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28   {..        if (
6080: 65 78 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75  expression == nu
6090: 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72  ll) throw new Ar
60a0: 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28  gumentException(
60b0: 22 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0d 0a  "expression");..
60c0: 20 20 20 20 20 20 20 20 56 69 73 69 74 45 78 70          VisitExp
60d0: 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 50 72  ressionBindingPr
60e0: 65 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70  e(expression.Inp
60f0: 75 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69  ut);..        Vi
6100: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28 65 78  sitExpression(ex
6110: 70 72 65 73 73 69 6f 6e 2e 50 72 65 64 69 63 61  pression.Predica
6120: 74 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69  te);..        Vi
6130: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e  sitExpressionBin
6140: 64 69 6e 67 50 6f 73 74 28 65 78 70 72 65 73 73  dingPost(express
6150: 69 6f 6e 2e 49 6e 70 75 74 29 3b 0d 0a 20 20 20  ion.Input);..   
6160: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75     }....      pu
6170: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f  blic override vo
6180: 69 64 20 56 69 73 69 74 28 44 62 52 65 66 45 78  id Visit(DbRefEx
6190: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
61a0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ion)..      {.. 
61b0: 20 20 20 20 20 20 20 56 69 73 69 74 55 6e 61 72         VisitUnar
61c0: 79 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72  yExpression(expr
61d0: 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  ession);..      
61e0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69  }....      publi
61f0: 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  c override void 
6200: 56 69 73 69 74 28 44 62 52 65 66 4b 65 79 45 78  Visit(DbRefKeyEx
6210: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
6220: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ion)..      {.. 
6230: 20 20 20 20 20 20 20 56 69 73 69 74 55 6e 61 72         VisitUnar
6240: 79 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72  yExpression(expr
6250: 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20  ession);..      
6260: 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69  }....      publi
6270: 63 20 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20  c override void 
6280: 56 69 73 69 74 28 44 62 52 65 6c 61 74 69 6f 6e  Visit(DbRelation
6290: 73 68 69 70 4e 61 76 69 67 61 74 69 6f 6e 45 78  shipNavigationEx
62a0: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
62b0: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20  ion)..      {.. 
62c0: 20 20 20 20 20 20 20 69 66 20 28 65 78 70 72 65         if (expre
62d0: 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74  ssion == null) t
62e0: 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e  hrow new Argumen
62f0: 74 45 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72  tException("expr
6300: 65 73 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 20  ession");..     
6310: 20 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69     VisitExpressi
6320: 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e 2e 4e 61  on(expression.Na
6330: 76 69 67 61 74 69 6f 6e 53 6f 75 72 63 65 29 3b  vigationSource);
6340: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6350: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
6360: 64 65 20 76 6f 69 64 20 56 69 73 69 74 28 44 62  de void Visit(Db
6370: 53 6b 69 70 45 78 70 72 65 73 73 69 6f 6e 20 65  SkipExpression e
6380: 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
6390: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20    {..        if 
63a0: 28 65 78 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e  (expression == n
63b0: 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77 20 41  ull) throw new A
63c0: 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e  rgumentException
63d0: 28 22 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0d  ("expression");.
63e0: 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 45 78  .        VisitEx
63f0: 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 50  pressionBindingP
6400: 72 65 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e  re(expression.In
6410: 70 75 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 66  put);..        f
6420: 6f 72 65 61 63 68 20 28 44 62 53 6f 72 74 43 6c  oreach (DbSortCl
6430: 61 75 73 65 20 63 6c 61 75 73 65 20 69 6e 20 65  ause clause in e
6440: 78 70 72 65 73 73 69 6f 6e 2e 53 6f 72 74 4f 72  xpression.SortOr
6450: 64 65 72 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d  der)..        {.
6460: 0a 20 20 20 20 20 20 20 20 20 20 56 69 73 69 74  .          Visit
6470: 45 78 70 72 65 73 73 69 6f 6e 28 63 6c 61 75 73  Expression(claus
6480: 65 2e 45 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a  e.Expression);..
6490: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
64a0: 20 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69     VisitExpressi
64b0: 6f 6e 42 69 6e 64 69 6e 67 50 6f 73 74 28 65 78  onBindingPost(ex
64c0: 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74 29 3b  pression.Input);
64d0: 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 45  ..        VisitE
64e0: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
64f0: 73 69 6f 6e 2e 43 6f 75 6e 74 29 3b 0d 0a 20 20  sion.Count);..  
6500: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70      }....      p
6510: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76  ublic override v
6520: 6f 69 64 20 56 69 73 69 74 28 44 62 53 6f 72 74  oid Visit(DbSort
6530: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
6540: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d  ssion)..      {.
6550: 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 78 70  .        if (exp
6560: 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29  ression == null)
6570: 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d   throw new Argum
6580: 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 65 78  entException("ex
6590: 70 72 65 73 73 69 6f 6e 22 29 3b 0d 0a 20 20 20  pression");..   
65a0: 20 20 20 20 20 56 69 73 69 74 45 78 70 72 65 73       VisitExpres
65b0: 73 69 6f 6e 42 69 6e 64 69 6e 67 50 72 65 28 65  sionBindingPre(e
65c0: 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75 74 29  xpression.Input)
65d0: 3b 0d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28  ;..        for (
65e0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 65  int i = 0; i < e
65f0: 78 70 72 65 73 73 69 6f 6e 2e 53 6f 72 74 4f 72  xpression.SortOr
6600: 64 65 72 2e 43 6f 75 6e 74 3b 20 69 2b 2b 29 0d  der.Count; i++).
6610: 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
6620: 20 20 20 20 20 20 56 69 73 69 74 45 78 70 72 65        VisitExpre
6630: 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e  ssion(expression
6640: 2e 53 6f 72 74 4f 72 64 65 72 5b 69 5d 2e 45 78  .SortOrder[i].Ex
6650: 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20  pression);..    
6660: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 56      }..        V
6670: 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69  isitExpressionBi
6680: 6e 64 69 6e 67 50 6f 73 74 28 65 78 70 72 65 73  ndingPost(expres
6690: 73 69 6f 6e 2e 49 6e 70 75 74 29 3b 0d 0a 20 20  sion.Input);..  
66a0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70      }....      p
66b0: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76  ublic override v
66c0: 6f 69 64 20 56 69 73 69 74 28 44 62 54 72 65 61  oid Visit(DbTrea
66d0: 74 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  tExpression expr
66e0: 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b  ession)..      {
66f0: 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 55  ..        VisitU
6700: 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65  naryExpression(e
6710: 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20  xpression);..   
6720: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75     }....      pu
6730: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f  blic override vo
6740: 69 64 20 56 69 73 69 74 28 44 62 55 6e 69 6f 6e  id Visit(DbUnion
6750: 41 6c 6c 45 78 70 72 65 73 73 69 6f 6e 20 65 78  AllExpression ex
6760: 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20  pression)..     
6770: 20 7b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69   {..        Visi
6780: 74 42 69 6e 61 72 79 28 65 78 70 72 65 73 73 69  tBinary(expressi
6790: 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  on);..      }...
67a0: 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76  .      public ov
67b0: 65 72 72 69 64 65 20 76 6f 69 64 20 56 69 73 69  erride void Visi
67c0: 74 28 44 62 56 61 72 69 61 62 6c 65 52 65 66 65  t(DbVariableRefe
67d0: 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 20  renceExpression 
67e0: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
67f0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66     {..        if
6800: 20 28 65 78 70 72 65 73 73 69 6f 6e 20 3d 3d 20   (expression == 
6810: 6e 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77 20  null) throw new 
6820: 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f  ArgumentExceptio
6830: 6e 28 22 65 78 70 72 65 73 73 69 6f 6e 22 29 3b  n("expression");
6840: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6850: 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61     public virtua
6860: 6c 20 76 6f 69 64 20 56 69 73 69 74 41 67 67 72  l void VisitAggr
6870: 65 67 61 74 65 28 44 62 41 67 67 72 65 67 61 74  egate(DbAggregat
6880: 65 20 61 67 67 72 65 67 61 74 65 29 0d 0a 20 20  e aggregate)..  
6890: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69      {..        i
68a0: 66 20 28 61 67 67 72 65 67 61 74 65 20 3d 3d 20  f (aggregate == 
68b0: 6e 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77 20  null) throw new 
68c0: 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f  ArgumentExceptio
68d0: 6e 28 22 61 67 67 72 65 67 61 74 65 22 29 3b 0d  n("aggregate");.
68e0: 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 45 78  .        VisitEx
68f0: 70 72 65 73 73 69 6f 6e 4c 69 73 74 28 61 67 67  pressionList(agg
6900: 72 65 67 61 74 65 2e 41 72 67 75 6d 65 6e 74 73  regate.Arguments
6910: 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  );..      }.... 
6920: 20 20 20 20 20 70 75 62 6c 69 63 20 76 69 72 74       public virt
6930: 75 61 6c 20 76 6f 69 64 20 56 69 73 69 74 41 67  ual void VisitAg
6940: 67 72 65 67 61 74 65 4c 69 73 74 28 49 4c 69 73  gregateList(ILis
6950: 74 3c 44 62 41 67 67 72 65 67 61 74 65 3e 20 61  t<DbAggregate> a
6960: 67 67 72 65 67 61 74 65 73 29 0d 0a 20 20 20 20  ggregates)..    
6970: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20    {..        if 
6980: 28 61 67 67 72 65 67 61 74 65 73 20 3d 3d 20 6e  (aggregates == n
6990: 75 6c 6c 29 20 74 68 72 6f 77 20 6e 65 77 20 41  ull) throw new A
69a0: 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e  rgumentException
69b0: 28 22 61 67 67 72 65 67 61 74 65 73 22 29 3b 0d  ("aggregates");.
69c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e  .        for (in
69d0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 61 67 67  t i = 0; i < agg
69e0: 72 65 67 61 74 65 73 2e 43 6f 75 6e 74 3b 20 69  regates.Count; i
69f0: 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ++)..        {..
6a00: 20 20 20 20 20 20 20 20 20 20 56 69 73 69 74 41            VisitA
6a10: 67 67 72 65 67 61 74 65 28 61 67 67 72 65 67 61  ggregate(aggrega
6a20: 74 65 73 5b 69 5d 29 3b 0d 0a 20 20 20 20 20 20  tes[i]);..      
6a30: 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    }..      }....
6a40: 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 69 72        public vir
6a50: 74 75 61 6c 20 76 6f 69 64 20 56 69 73 69 74 45  tual void VisitE
6a60: 78 70 72 65 73 73 69 6f 6e 28 44 62 45 78 70 72  xpression(DbExpr
6a70: 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ession expressio
6a80: 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  n)..      {..   
6a90: 20 20 20 20 20 69 66 20 28 65 78 70 72 65 73 73       if (express
6aa0: 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72  ion == null) thr
6ab0: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45  ow new ArgumentE
6ac0: 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72 65 73  xception("expres
6ad0: 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 20 20 20  sion");..       
6ae0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 41 63 63 65   expression.Acce
6af0: 70 74 28 74 68 69 73 29 3b 0d 0a 20 20 20 20 20  pt(this);..     
6b00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 72 6f 74   }....      prot
6b10: 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 76 6f  ected virtual vo
6b20: 69 64 20 56 69 73 69 74 45 78 70 72 65 73 73 69  id VisitExpressi
6b30: 6f 6e 42 69 6e 64 69 6e 67 50 6f 73 74 28 44 62  onBindingPost(Db
6b40: 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e  ExpressionBindin
6b50: 67 20 62 69 6e 64 69 6e 67 29 0d 0a 20 20 20 20  g binding)..    
6b60: 20 20 7b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a    {..      }....
6b70: 20 20 20 20 20 20 70 72 6f 74 65 63 74 65 64 20        protected 
6b80: 76 69 72 74 75 61 6c 20 76 6f 69 64 20 56 69 73  virtual void Vis
6b90: 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64  itExpressionBind
6ba0: 69 6e 67 50 72 65 28 44 62 45 78 70 72 65 73 73  ingPre(DbExpress
6bb0: 69 6f 6e 42 69 6e 64 69 6e 67 20 62 69 6e 64 69  ionBinding bindi
6bc0: 6e 67 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ng)..      {..  
6bd0: 20 20 20 20 20 20 69 66 20 28 62 69 6e 64 69 6e        if (bindin
6be0: 67 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72 6f 77  g == null) throw
6bf0: 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63   new ArgumentExc
6c00: 65 70 74 69 6f 6e 28 22 62 69 6e 64 69 6e 67 22  eption("binding"
6c10: 29 3b 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69  );..        Visi
6c20: 74 45 78 70 72 65 73 73 69 6f 6e 28 62 69 6e 64  tExpression(bind
6c30: 69 6e 67 2e 45 78 70 72 65 73 73 69 6f 6e 29 3b  ing.Expression);
6c40: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
6c50: 20 20 20 70 75 62 6c 69 63 20 76 69 72 74 75 61     public virtua
6c60: 6c 20 76 6f 69 64 20 56 69 73 69 74 45 78 70 72  l void VisitExpr
6c70: 65 73 73 69 6f 6e 4c 69 73 74 28 49 4c 69 73 74  essionList(IList
6c80: 3c 44 62 45 78 70 72 65 73 73 69 6f 6e 3e 20 65  <DbExpression> e
6c90: 78 70 72 65 73 73 69 6f 6e 4c 69 73 74 29 0d 0a  xpressionList)..
6ca0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6cb0: 20 69 66 20 28 65 78 70 72 65 73 73 69 6f 6e 4c   if (expressionL
6cc0: 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72  ist == null) thr
6cd0: 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45  ow new ArgumentE
6ce0: 78 63 65 70 74 69 6f 6e 28 22 65 78 70 72 65 73  xception("expres
6cf0: 73 69 6f 6e 4c 69 73 74 22 29 3b 0d 0a 20 20 20  sionList");..   
6d00: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20       for (int i 
6d10: 3d 20 30 3b 20 69 20 3c 20 65 78 70 72 65 73 73  = 0; i < express
6d20: 69 6f 6e 4c 69 73 74 2e 43 6f 75 6e 74 3b 20 69  ionList.Count; i
6d30: 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ++)..        {..
6d40: 20 20 20 20 20 20 20 20 20 20 56 69 73 69 74 45            VisitE
6d50: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
6d60: 73 69 6f 6e 4c 69 73 74 5b 69 5d 29 3b 0d 0a 20  sionList[i]);.. 
6d70: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6d80: 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 72 6f 74 65  }....      prote
6d90: 63 74 65 64 20 76 69 72 74 75 61 6c 20 76 6f 69  cted virtual voi
6da0: 64 20 56 69 73 69 74 47 72 6f 75 70 45 78 70 72  d VisitGroupExpr
6db0: 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 4d 69 64  essionBindingMid
6dc0: 28 44 62 47 72 6f 75 70 45 78 70 72 65 73 73 69  (DbGroupExpressi
6dd0: 6f 6e 42 69 6e 64 69 6e 67 20 62 69 6e 64 69 6e  onBinding bindin
6de0: 67 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  g)..      {..   
6df0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 72     }....      pr
6e00: 6f 74 65 63 74 65 64 20 76 69 72 74 75 61 6c 20  otected virtual 
6e10: 76 6f 69 64 20 56 69 73 69 74 47 72 6f 75 70 45  void VisitGroupE
6e20: 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67  xpressionBinding
6e30: 50 6f 73 74 28 44 62 47 72 6f 75 70 45 78 70 72  Post(DbGroupExpr
6e40: 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 20 62 69  essionBinding bi
6e50: 6e 64 69 6e 67 29 0d 0a 20 20 20 20 20 20 7b 0d  nding)..      {.
6e60: 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  .      }....    
6e70: 20 20 70 72 6f 74 65 63 74 65 64 20 76 69 72 74    protected virt
6e80: 75 61 6c 20 76 6f 69 64 20 56 69 73 69 74 47 72  ual void VisitGr
6e90: 6f 75 70 45 78 70 72 65 73 73 69 6f 6e 42 69 6e  oupExpressionBin
6ea0: 64 69 6e 67 50 72 65 28 44 62 47 72 6f 75 70 45  dingPre(DbGroupE
6eb0: 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67  xpressionBinding
6ec0: 20 62 69 6e 64 69 6e 67 29 0d 0a 20 20 20 20 20   binding)..     
6ed0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28   {..        if (
6ee0: 62 69 6e 64 69 6e 67 20 3d 3d 20 6e 75 6c 6c 29  binding == null)
6ef0: 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d   throw new Argum
6f00: 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 62 69  entException("bi
6f10: 6e 64 69 6e 67 22 29 3b 0d 0a 20 20 20 20 20 20  nding");..      
6f20: 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f    VisitExpressio
6f30: 6e 28 62 69 6e 64 69 6e 67 2e 45 78 70 72 65 73  n(binding.Expres
6f40: 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  sion);..      }.
6f50: 0a 0d 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74  ...      protect
6f60: 65 64 20 76 69 72 74 75 61 6c 20 76 6f 69 64 20  ed virtual void 
6f70: 56 69 73 69 74 4c 61 6d 62 64 61 46 75 6e 63 74  VisitLambdaFunct
6f80: 69 6f 6e 50 6f 73 74 28 45 64 6d 46 75 6e 63 74  ionPost(EdmFunct
6f90: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2c 20 44 62  ion function, Db
6fa0: 45 78 70 72 65 73 73 69 6f 6e 20 62 6f 64 79 29  Expression body)
6fb0: 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20  ..      {..     
6fc0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 72 6f 74   }....      prot
6fd0: 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 76 6f  ected virtual vo
6fe0: 69 64 20 56 69 73 69 74 4c 61 6d 62 64 61 46 75  id VisitLambdaFu
6ff0: 6e 63 74 69 6f 6e 50 72 65 28 45 64 6d 46 75 6e  nctionPre(EdmFun
7000: 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 2c 20  ction function, 
7010: 44 62 45 78 70 72 65 73 73 69 6f 6e 20 62 6f 64  DbExpression bod
7020: 79 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  y)..      {..   
7030: 20 20 20 20 20 69 66 20 28 66 75 6e 63 74 69 6f       if (functio
7040: 6e 20 3d 3d 20 6e 75 6c 6c 29 20 74 68 72 6f 77  n == null) throw
7050: 20 6e 65 77 20 41 72 67 75 6d 65 6e 74 45 78 63   new ArgumentExc
7060: 65 70 74 69 6f 6e 28 22 66 75 6e 63 74 69 6f 6e  eption("function
7070: 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 69 66 20  ");..        if 
7080: 28 62 6f 64 79 20 3d 3d 20 6e 75 6c 6c 29 20 74  (body == null) t
7090: 68 72 6f 77 20 6e 65 77 20 41 72 67 75 6d 65 6e  hrow new Argumen
70a0: 74 45 78 63 65 70 74 69 6f 6e 28 22 62 6f 64 79  tException("body
70b0: 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a  ");..      }....
70c0: 20 20 20 20 20 20 2f 2f 69 6e 74 65 72 6e 61 6c        //internal
70d0: 20 76 69 72 74 75 61 6c 20 76 6f 69 64 20 56 69   virtual void Vi
70e0: 73 69 74 52 65 6c 61 74 65 64 45 6e 74 69 74 79  sitRelatedEntity
70f0: 52 65 66 65 72 65 6e 63 65 28 44 62 52 65 6c 61  Reference(DbRela
7100: 74 65 64 45 6e 74 69 74 79 52 65 66 20 72 65 6c  tedEntityRef rel
7110: 61 74 65 64 45 6e 74 69 74 79 52 65 66 29 0d 0a  atedEntityRef)..
7120: 20 20 20 20 20 20 2f 2f 7b 0d 0a 20 20 20 20 20        //{..     
7130: 20 2f 2f 20 20 56 69 73 69 74 45 78 70 72 65 73   //  VisitExpres
7140: 73 69 6f 6e 28 72 65 6c 61 74 65 64 45 6e 74 69  sion(relatedEnti
7150: 74 79 52 65 66 2e 54 61 72 67 65 74 45 6e 74 69  tyRef.TargetEnti
7160: 74 79 52 65 66 65 72 65 6e 63 65 29 3b 0d 0a 20  tyReference);.. 
7170: 20 20 20 20 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20       //}....    
7180: 20 20 2f 2f 69 6e 74 65 72 6e 61 6c 20 76 69 72    //internal vir
7190: 74 75 61 6c 20 76 6f 69 64 20 56 69 73 69 74 52  tual void VisitR
71a0: 65 6c 61 74 65 64 45 6e 74 69 74 79 52 65 66 65  elatedEntityRefe
71b0: 72 65 6e 63 65 4c 69 73 74 28 49 4c 69 73 74 3c  renceList(IList<
71c0: 44 62 52 65 6c 61 74 65 64 45 6e 74 69 74 79 52  DbRelatedEntityR
71d0: 65 66 3e 20 72 65 6c 61 74 65 64 45 6e 74 69 74  ef> relatedEntit
71e0: 79 52 65 66 65 72 65 6e 63 65 73 29 0d 0a 20 20  yReferences)..  
71f0: 20 20 20 20 2f 2f 7b 0d 0a 20 20 20 20 20 20 2f      //{..      /
7200: 2f 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20  /  for (int i = 
7210: 30 3b 20 69 20 3c 20 72 65 6c 61 74 65 64 45 6e  0; i < relatedEn
7220: 74 69 74 79 52 65 66 65 72 65 6e 63 65 73 2e 43  tityReferences.C
7230: 6f 75 6e 74 3b 20 69 2b 2b 29 0d 0a 20 20 20 20  ount; i++)..    
7240: 20 20 2f 2f 20 20 7b 0d 0a 20 20 20 20 20 20 2f    //  {..      /
7250: 2f 20 20 20 20 56 69 73 69 74 52 65 6c 61 74 65  /    VisitRelate
7260: 64 45 6e 74 69 74 79 52 65 66 65 72 65 6e 63 65  dEntityReference
7270: 28 72 65 6c 61 74 65 64 45 6e 74 69 74 79 52 65  (relatedEntityRe
7280: 66 65 72 65 6e 63 65 73 5b 69 5d 29 3b 0d 0a 20  ferences[i]);.. 
7290: 20 20 20 20 20 2f 2f 20 20 7d 0d 0a 20 20 20 20       //  }..    
72a0: 20 20 2f 2f 7d 0d 0a 0d 0a 20 20 20 20 20 20 70    //}....      p
72b0: 72 6f 74 65 63 74 65 64 20 76 69 72 74 75 61 6c  rotected virtual
72c0: 20 76 6f 69 64 20 56 69 73 69 74 55 6e 61 72 79   void VisitUnary
72d0: 45 78 70 72 65 73 73 69 6f 6e 28 44 62 55 6e 61  Expression(DbUna
72e0: 72 79 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70  ryExpression exp
72f0: 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20  ression)..      
7300: 7b 0d 0a 20 20 20 20 20 20 20 20 69 66 20 28 65  {..        if (e
7310: 78 70 72 65 73 73 69 6f 6e 20 3d 3d 20 6e 75 6c  xpression == nul
7320: 6c 29 20 74 68 72 6f 77 20 6e 65 77 20 41 72 67  l) throw new Arg
7330: 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22  umentException("
7340: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0d 0a 20  expression");.. 
7350: 20 20 20 20 20 20 20 56 69 73 69 74 45 78 70 72         VisitExpr
7360: 65 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f  ession(expressio
7370: 6e 2e 41 72 67 75 6d 65 6e 74 29 3b 0d 0a 20 20  n.Argument);..  
7380: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 23 65 6e      }..      #en
7390: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
73a0: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
73b0: 20 76 6f 69 64 20 56 69 73 69 74 28 44 62 41 6e   void Visit(DbAn
73c0: 64 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  dExpression expr
73d0: 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b  ession)..      {
73e0: 0d 0a 20 20 20 20 20 20 20 20 56 69 73 69 74 42  ..        VisitB
73f0: 69 6e 61 72 79 28 65 78 70 72 65 73 73 69 6f 6e  inary(expression
7400: 2c 20 22 20 41 4e 44 20 22 29 3b 0d 0a 20 20 20  , " AND ");..   
7410: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75     }....      pu
7420: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f  blic override vo
7430: 69 64 20 56 69 73 69 74 28 44 62 4f 72 45 78 70  id Visit(DbOrExp
7440: 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
7450: 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  on)..      {..  
7460: 20 20 20 20 20 20 56 69 73 69 74 42 69 6e 61 72        VisitBinar
7470: 79 28 65 78 70 72 65 73 73 69 6f 6e 2c 20 22 20  y(expression, " 
7480: 4f 52 20 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d  OR ");..      }.
7490: 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20  ...      public 
74a0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 56 69  override void Vi
74b0: 73 69 74 28 44 62 43 6f 6d 70 61 72 69 73 6f 6e  sit(DbComparison
74c0: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
74d0: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d  ssion)..      {.
74e0: 0a 20 20 20 20 20 20 20 20 44 65 62 75 67 2e 41  .        Debug.A
74f0: 73 73 65 72 74 28 65 78 70 72 65 73 73 69 6f 6e  ssert(expression
7500: 2e 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 20  .ExpressionKind 
7510: 3d 3d 20 44 62 45 78 70 72 65 73 73 69 6f 6e 4b  == DbExpressionK
7520: 69 6e 64 2e 45 71 75 61 6c 73 2c 0d 0a 20 20 20  ind.Equals,..   
7530: 20 20 20 20 20 20 20 20 20 22 6f 6e 6c 79 20 65           "only e
7540: 71 75 61 6c 73 20 63 6f 6d 70 61 72 69 73 6f 6e  quals comparison
7550: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
7560: 20 70 72 6f 64 75 63 65 64 20 69 6e 20 44 4d 4c   produced in DML
7570: 20 63 6f 6d 6d 61 6e 64 20 74 72 65 65 73 20 69   command trees i
7580: 6e 20 56 31 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  n V1");....     
7590: 20 20 20 56 69 73 69 74 42 69 6e 61 72 79 28 65     VisitBinary(e
75a0: 78 70 72 65 73 73 69 6f 6e 2c 20 22 20 3d 20 22  xpression, " = "
75b0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 52 65  );....        Re
75c0: 67 69 73 74 65 72 4d 65 6d 62 65 72 56 61 6c 75  gisterMemberValu
75d0: 65 28 65 78 70 72 65 73 73 69 6f 6e 2e 4c 65 66  e(expression.Lef
75e0: 74 2c 20 65 78 70 72 65 73 73 69 6f 6e 2e 52 69  t, expression.Ri
75f0: 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a  ght);..      }..
7600: 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 73 75 6d  ..      /// <sum
7610: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f  mary>..      ///
7620: 20 43 61 6c 6c 20 74 68 69 73 20 6d 65 74 68 6f   Call this metho
7630: 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 61 20  d to register a 
7640: 70 72 6f 70 65 72 74 79 20 76 61 6c 75 65 20 70  property value p
7650: 61 69 72 20 73 6f 20 74 68 65 20 74 72 61 6e 73  air so the trans
7660: 6c 61 74 6f 72 20 22 72 65 6d 65 6d 62 65 72 73  lator "remembers
7670: 22 0d 0a 20 20 20 20 20 20 2f 2f 2f 20 74 68 65  "..      /// the
7680: 20 76 61 6c 75 65 73 20 66 6f 72 20 6d 65 6d 62   values for memb
7690: 65 72 73 20 6f 66 20 74 68 65 20 72 6f 77 20 62  ers of the row b
76a0: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 54  eing modified. T
76b0: 68 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20  hese values can 
76c0: 74 68 65 6e 20 62 65 20 75 73 65 64 0d 0a 20 20  then be used..  
76d0: 20 20 20 20 2f 2f 2f 20 74 6f 20 66 6f 72 6d 20      /// to form 
76e0: 61 20 70 72 65 64 69 63 61 74 65 20 66 6f 72 20  a predicate for 
76f0: 73 65 72 76 65 72 2d 67 65 6e 65 72 61 74 69 6f  server-generatio
7700: 6e 20 28 62 61 73 65 64 20 6f 6e 20 74 68 65 20  n (based on the 
7710: 6b 65 79 20 6f 66 20 74 68 65 20 72 6f 77 29 0d  key of the row).
7720: 0a 20 20 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d  .      /// </sum
7730: 6d 61 72 79 3e 0d 0a 20 20 20 20 20 20 2f 2f 2f  mary>..      ///
7740: 20 3c 70 61 72 61 6d 20 6e 61 6d 65 3d 22 70 72   <param name="pr
7750: 6f 70 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e  opertyExpression
7760: 22 3e 44 62 45 78 70 72 65 73 73 69 6f 6e 20 63  ">DbExpression c
7770: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
7780: 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 20 28  lumn reference (
7790: 70 72 6f 70 65 72 74 79 20 65 78 70 72 65 73 73  property express
77a0: 69 6f 6e 29 2e 3c 2f 70 61 72 61 6d 3e 0d 0a 20  ion).</param>.. 
77b0: 20 20 20 20 20 2f 2f 2f 20 3c 70 61 72 61 6d 20       /// <param 
77c0: 6e 61 6d 65 3d 22 76 61 6c 75 65 22 3e 44 62 45  name="value">DbE
77d0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
77e0: 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 6f  ning the value o
77f0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 3c 2f 70  f the column.</p
7800: 61 72 61 6d 3e 0d 0a 20 20 20 20 20 20 69 6e 74  aram>..      int
7810: 65 72 6e 61 6c 20 76 6f 69 64 20 52 65 67 69 73  ernal void Regis
7820: 74 65 72 4d 65 6d 62 65 72 56 61 6c 75 65 28 44  terMemberValue(D
7830: 62 45 78 70 72 65 73 73 69 6f 6e 20 70 72 6f 70  bExpression prop
7840: 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 2c 20  ertyExpression, 
7850: 44 62 45 78 70 72 65 73 73 69 6f 6e 20 76 61 6c  DbExpression val
7860: 75 65 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20  ue)..      {..  
7870: 20 20 20 20 20 20 69 66 20 28 6e 75 6c 6c 20 21        if (null !
7880: 3d 20 5f 6d 65 6d 62 65 72 56 61 6c 75 65 73 29  = _memberValues)
7890: 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
78a0: 20 20 20 20 20 20 20 2f 2f 20 72 65 67 69 73 74         // regist
78b0: 65 72 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  er the value for
78c0: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 0d 0a   this property..
78d0: 20 20 20 20 20 20 20 20 20 20 44 65 62 75 67 2e            Debug.
78e0: 41 73 73 65 72 74 28 70 72 6f 70 65 72 74 79 45  Assert(propertyE
78f0: 78 70 72 65 73 73 69 6f 6e 2e 45 78 70 72 65 73  xpression.Expres
7900: 73 69 6f 6e 4b 69 6e 64 20 3d 3d 20 44 62 45 78  sionKind == DbEx
7910: 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e 50 72 6f  pressionKind.Pro
7920: 70 65 72 74 79 2c 0d 0a 20 20 20 20 20 20 20 20  perty,..        
7930: 20 20 20 20 20 20 22 44 4d 4c 20 70 72 65 64 69        "DML predi
7940: 63 61 74 65 73 20 61 6e 64 20 73 65 74 74 65 72  cates and setter
7950: 73 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65  s must be of the
7960: 20 66 6f 72 6d 20 70 72 6f 70 65 72 74 79 20 3d   form property =
7970: 20 76 61 6c 75 65 22 29 3b 0d 0a 0d 0a 20 20 20   value");....   
7980: 20 20 20 20 20 20 20 2f 2f 20 67 65 74 20 6e 61         // get na
7990: 6d 65 20 6f 66 20 6c 65 66 74 20 70 72 6f 70 65  me of left prope
79a0: 72 74 79 20 0d 0a 20 20 20 20 20 20 20 20 20 20  rty ..          
79b0: 45 64 6d 4d 65 6d 62 65 72 20 70 72 6f 70 65 72  EdmMember proper
79c0: 74 79 20 3d 20 28 28 44 62 50 72 6f 70 65 72 74  ty = ((DbPropert
79d0: 79 45 78 70 72 65 73 73 69 6f 6e 29 70 72 6f 70  yExpression)prop
79e0: 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 29 2e  ertyExpression).
79f0: 50 72 6f 70 65 72 74 79 3b 0d 0a 0d 0a 20 20 20  Property;....   
7a00: 20 20 20 20 20 20 20 2f 2f 20 64 6f 6e 27 74 20         // don't 
7a10: 74 72 61 63 6b 20 6e 75 6c 6c 20 76 61 6c 75 65  track null value
7a20: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 20  s..          if 
7a30: 28 76 61 6c 75 65 2e 45 78 70 72 65 73 73 69 6f  (value.Expressio
7a40: 6e 4b 69 6e 64 20 21 3d 20 44 62 45 78 70 72 65  nKind != DbExpre
7a50: 73 73 69 6f 6e 4b 69 6e 64 2e 4e 75 6c 6c 29 0d  ssionKind.Null).
7a60: 0a 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  .          {..  
7a70: 20 20 20 20 20 20 20 20 20 20 44 65 62 75 67 2e            Debug.
7a80: 41 73 73 65 72 74 28 76 61 6c 75 65 2e 45 78 70  Assert(value.Exp
7a90: 72 65 73 73 69 6f 6e 4b 69 6e 64 20 3d 3d 20 44  ressionKind == D
7aa0: 62 45 78 70 72 65 73 73 69 6f 6e 4b 69 6e 64 2e  bExpressionKind.
7ab0: 43 6f 6e 73 74 61 6e 74 2c 0d 0a 20 20 20 20 20  Constant,..     
7ac0: 20 20 20 20 20 20 20 20 20 20 20 22 76 61 6c 75             "valu
7ad0: 65 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f  e must either co
7ae0: 6e 73 74 61 6e 74 20 6f 72 20 6e 75 6c 6c 22 29  nstant or null")
7af0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;..            /
7b00: 2f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 6c  / retrieve the l
7b10: 61 73 74 20 70 61 72 61 6d 65 74 65 72 20 61 64  ast parameter ad
7b20: 64 65 64 20 28 77 68 69 63 68 20 64 65 73 63 72  ded (which descr
7b30: 69 62 65 73 20 74 68 65 20 70 61 72 61 6d 65 74  ibes the paramet
7b40: 65 72 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  er)..           
7b50: 20 5f 6d 65 6d 62 65 72 56 61 6c 75 65 73 5b 70   _memberValues[p
7b60: 72 6f 70 65 72 74 79 5d 20 3d 20 5f 70 61 72 61  roperty] = _para
7b70: 6d 65 74 65 72 73 5b 5f 70 61 72 61 6d 65 74 65  meters[_paramete
7b80: 72 73 2e 43 6f 75 6e 74 20 2d 20 31 5d 3b 0d 0a  rs.Count - 1];..
7b90: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
7ba0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 7d 0d       }..      }.
7bb0: 0a 0d 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20  ...      public 
7bc0: 6f 76 65 72 72 69 64 65 20 76 6f 69 64 20 56 69  override void Vi
7bd0: 73 69 74 28 44 62 49 73 4e 75 6c 6c 45 78 70 72  sit(DbIsNullExpr
7be0: 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ession expressio
7bf0: 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a 20 20 20  n)..      {..   
7c00: 20 20 20 20 20 65 78 70 72 65 73 73 69 6f 6e 2e       expression.
7c10: 41 72 67 75 6d 65 6e 74 2e 41 63 63 65 70 74 28  Argument.Accept(
7c20: 74 68 69 73 29 3b 0d 0a 20 20 20 20 20 20 20 20  this);..        
7c30: 5f 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70  _commandText.App
7c40: 65 6e 64 28 22 20 49 53 20 4e 55 4c 4c 22 29 3b  end(" IS NULL");
7c50: 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  ..      }....   
7c60: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
7c70: 64 65 20 76 6f 69 64 20 56 69 73 69 74 28 44 62  de void Visit(Db
7c80: 4e 6f 74 45 78 70 72 65 73 73 69 6f 6e 20 65 78  NotExpression ex
7c90: 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 20  pression)..     
7ca0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 5f 63 6f 6d   {..        _com
7cb0: 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 28  mandText.Append(
7cc0: 22 4e 4f 54 20 28 22 29 3b 0d 0a 20 20 20 20 20  "NOT (");..     
7cd0: 20 20 20 65 78 70 72 65 73 73 69 6f 6e 2e 41 63     expression.Ac
7ce0: 63 65 70 74 28 74 68 69 73 29 3b 0d 0a 20 20 20  cept(this);..   
7cf0: 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64 54 65 78       _commandTex
7d00: 74 2e 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a  t.Append(")");..
7d10: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7d20: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
7d30: 20 76 6f 69 64 20 56 69 73 69 74 28 44 62 43 6f   void Visit(DbCo
7d40: 6e 73 74 61 6e 74 45 78 70 72 65 73 73 69 6f 6e  nstantExpression
7d50: 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20   expression)..  
7d60: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 53      {..        S
7d70: 51 4c 69 74 65 50 61 72 61 6d 65 74 65 72 20 70  QLiteParameter p
7d80: 61 72 61 6d 65 74 65 72 20 3d 20 43 72 65 61 74  arameter = Creat
7d90: 65 50 61 72 61 6d 65 74 65 72 28 65 78 70 72 65  eParameter(expre
7da0: 73 73 69 6f 6e 2e 56 61 6c 75 65 2c 20 65 78 70  ssion.Value, exp
7db0: 72 65 73 73 69 6f 6e 2e 52 65 73 75 6c 74 54 79  ression.ResultTy
7dc0: 70 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 5f 63  pe);..        _c
7dd0: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
7de0: 64 28 70 61 72 61 6d 65 74 65 72 2e 50 61 72 61  d(parameter.Para
7df0: 6d 65 74 65 72 4e 61 6d 65 29 3b 0d 0a 20 20 20  meterName);..   
7e00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75     }....      pu
7e10: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f  blic override vo
7e20: 69 64 20 56 69 73 69 74 28 44 62 53 63 61 6e 45  id Visit(DbScanE
7e30: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
7e40: 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  sion)..      {..
7e50: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64          string d
7e60: 65 66 69 6e 69 6e 67 51 75 65 72 79 20 3d 20 4d  efiningQuery = M
7e70: 65 74 61 64 61 74 61 48 65 6c 70 65 72 73 2e 54  etadataHelpers.T
7e80: 72 79 47 65 74 56 61 6c 75 65 46 6f 72 4d 65 74  ryGetValueForMet
7e90: 61 64 61 74 61 50 72 6f 70 65 72 74 79 3c 73 74  adataProperty<st
7ea0: 72 69 6e 67 3e 28 65 78 70 72 65 73 73 69 6f 6e  ring>(expression
7eb0: 2e 54 61 72 67 65 74 2c 20 22 44 65 66 69 6e 69  .Target, "Defini
7ec0: 6e 67 51 75 65 72 79 22 29 3b 0d 0a 20 20 20 20  ngQuery");..    
7ed0: 20 20 20 20 69 66 20 28 64 65 66 69 6e 69 6e 67      if (defining
7ee0: 51 75 65 72 79 20 21 3d 20 6e 75 6c 6c 29 0d 0a  Query != null)..
7ef0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
7f00: 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e       throw new N
7f10: 6f 74 53 75 70 70 6f 72 74 65 64 45 78 63 65 70  otSupportedExcep
7f20: 74 69 6f 6e 28 53 74 72 69 6e 67 2e 46 6f 72 6d  tion(String.Form
7f30: 61 74 28 22 55 6e 61 62 6c 65 20 74 6f 20 75 70  at("Unable to up
7f40: 64 61 74 65 20 74 68 65 20 45 6e 74 69 74 79 53  date the EntityS
7f50: 65 74 20 27 7b 30 7d 27 20 62 65 63 61 75 73 65  et '{0}' because
7f60: 20 69 74 20 68 61 73 20 61 20 44 65 66 69 6e 69   it has a Defini
7f70: 6e 67 51 75 65 72 79 20 61 6e 64 20 6e 6f 20 3c  ngQuery and no <
7f80: 7b 31 7d 3e 20 65 6c 65 6d 65 6e 74 20 65 78 69  {1}> element exi
7f90: 73 74 73 20 69 6e 20 74 68 65 20 3c 4d 6f 64 69  sts in the <Modi
7fa0: 66 69 63 61 74 69 6f 6e 46 75 6e 63 74 69 6f 6e  ficationFunction
7fb0: 4d 61 70 70 69 6e 67 3e 20 65 6c 65 6d 65 6e 74  Mapping> element
7fc0: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20   to support the 
7fd0: 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f  current operatio
7fe0: 6e 2e 22 2c 20 65 78 70 72 65 73 73 69 6f 6e 2e  n.", expression.
7ff0: 54 61 72 67 65 74 2e 4e 61 6d 65 2c 20 5f 6b 69  Target.Name, _ki
8000: 6e 64 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d  nd));..        }
8010: 0d 0a 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61  ..        _comma
8020: 6e 64 54 65 78 74 2e 41 70 70 65 6e 64 28 53 71  ndText.Append(Sq
8030: 6c 47 65 6e 65 72 61 74 6f 72 2e 47 65 74 54 61  lGenerator.GetTa
8040: 72 67 65 74 54 53 71 6c 28 65 78 70 72 65 73 73  rgetTSql(express
8050: 69 6f 6e 2e 54 61 72 67 65 74 29 29 3b 0d 0a 20  ion.Target));.. 
8060: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
8070: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
8080: 76 6f 69 64 20 56 69 73 69 74 28 44 62 50 72 6f  void Visit(DbPro
8090: 70 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 20  pertyExpression 
80a0: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
80b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 5f 63     {..        _c
80c0: 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70 65 6e  ommandText.Appen
80d0: 64 28 47 65 6e 65 72 61 74 65 4d 65 6d 62 65 72  d(GenerateMember
80e0: 54 53 71 6c 28 65 78 70 72 65 73 73 69 6f 6e 2e  TSql(expression.
80f0: 50 72 6f 70 65 72 74 79 29 29 3b 0d 0a 20 20 20  Property));..   
8100: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 75     }....      pu
8110: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 76 6f  blic override vo
8120: 69 64 20 56 69 73 69 74 28 44 62 4e 75 6c 6c 45  id Visit(DbNullE
8130: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
8140: 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  sion)..      {..
8150: 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64          _command
8160: 54 65 78 74 2e 41 70 70 65 6e 64 28 22 4e 55 4c  Text.Append("NUL
8170: 4c 22 29 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 0d  L");..      }...
8180: 0a 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 76  .      public ov
8190: 65 72 72 69 64 65 20 76 6f 69 64 20 56 69 73 69  erride void Visi
81a0: 74 28 44 62 4e 65 77 49 6e 73 74 61 6e 63 65 45  t(DbNewInstanceE
81b0: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
81c0: 73 69 6f 6e 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  sion)..      {..
81d0: 20 20 20 20 20 20 20 20 2f 2f 20 61 73 73 75 6d          // assum
81e0: 65 73 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73  es all arguments
81f0: 20 61 72 65 20 73 65 6c 66 2d 64 65 73 63 72 69   are self-descri
8200: 62 69 6e 67 20 28 6e 6f 20 6e 65 65 64 20 74 6f  bing (no need to
8210: 20 75 73 65 20 61 6c 69 61 73 65 73 0d 0a 20 20   use aliases..  
8220: 20 20 20 20 20 20 2f 2f 20 62 65 63 61 75 73 65        // because
8230: 20 6e 6f 20 72 65 6e 61 6d 65 73 20 61 72 65 20   no renames are 
8240: 65 76 65 72 20 75 73 65 64 20 69 6e 20 74 68 65  ever used in the
8250: 20 70 72 6f 6a 65 63 74 69 6f 6e 29 0d 0a 20 20   projection)..  
8260: 20 20 20 20 20 20 62 6f 6f 6c 20 66 69 72 73 74        bool first
8270: 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
8280: 20 20 66 6f 72 65 61 63 68 20 28 44 62 45 78 70    foreach (DbExp
8290: 72 65 73 73 69 6f 6e 20 61 72 67 75 6d 65 6e 74  ression argument
82a0: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 41   in expression.A
82b0: 72 67 75 6d 65 6e 74 73 29 0d 0a 20 20 20 20 20  rguments)..     
82c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
82d0: 69 66 20 28 66 69 72 73 74 29 20 7b 20 66 69 72  if (first) { fir
82e0: 73 74 20 3d 20 66 61 6c 73 65 3b 20 7d 0d 0a 20  st = false; }.. 
82f0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 20           else { 
8300: 5f 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41 70 70  _commandText.App
8310: 65 6e 64 28 22 2c 20 22 29 3b 20 7d 0d 0a 20 20  end(", "); }..  
8320: 20 20 20 20 20 20 20 20 61 72 67 75 6d 65 6e 74          argument
8330: 2e 41 63 63 65 70 74 28 74 68 69 73 29 3b 0d 0a  .Accept(this);..
8340: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8350: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 70 72 69 76   }....      priv
8360: 61 74 65 20 76 6f 69 64 20 56 69 73 69 74 42 69  ate void VisitBi
8370: 6e 61 72 79 28 44 62 42 69 6e 61 72 79 45 78 70  nary(DbBinaryExp
8380: 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
8390: 6f 6e 2c 20 73 74 72 69 6e 67 20 73 65 70 61 72  on, string separ
83a0: 61 74 6f 72 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  ator)..      {..
83b0: 20 20 20 20 20 20 20 20 5f 63 6f 6d 6d 61 6e 64          _command
83c0: 54 65 78 74 2e 41 70 70 65 6e 64 28 22 28 22 29  Text.Append("(")
83d0: 3b 0d 0a 20 20 20 20 20 20 20 20 65 78 70 72 65  ;..        expre
83e0: 73 73 69 6f 6e 2e 4c 65 66 74 2e 41 63 63 65 70  ssion.Left.Accep
83f0: 74 28 74 68 69 73 29 3b 0d 0a 20 20 20 20 20 20  t(this);..      
8400: 20 20 5f 63 6f 6d 6d 61 6e 64 54 65 78 74 2e 41    _commandText.A
8410: 70 70 65 6e 64 28 73 65 70 61 72 61 74 6f 72 29  ppend(separator)
8420: 3b 0d 0a 20 20 20 20 20 20 20 20 65 78 70 72 65  ;..        expre
8430: 73 73 69 6f 6e 2e 52 69 67 68 74 2e 41 63 63 65  ssion.Right.Acce
8440: 70 74 28 74 68 69 73 29 3b 0d 0a 20 20 20 20 20  pt(this);..     
8450: 20 20 20 5f 63 6f 6d 6d 61 6e 64 54 65 78 74 2e     _commandText.
8460: 41 70 70 65 6e 64 28 22 29 22 29 3b 0d 0a 20 20  Append(")");..  
8470: 20 20 20 20 7d 0d 0a 20 20 20 20 7d 0d 0a 20 20      }..    }..  
8480: 7d 0d 0a 7d 0d 0a 0d 0a                          }..}....