System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 36b6fc1d2255e6e754a3c1652c636b5e02818c2d:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 20 2a 20 41 44  *********.. * AD
0040: 4f 2e 4e 45 54 20 32 2e 30 20 44 61 74 61 20 50  O.NET 2.0 Data P
0050: 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
0060: 74 65 20 56 65 72 73 69 6f 6e 20 33 2e 58 0d 0a  te Version 3.X..
0070: 20 2a 20 57 72 69 74 74 65 6e 20 62 79 20 52 6f   * Written by Ro
0080: 62 65 72 74 20 53 69 6d 70 73 6f 6e 20 28 72 6f  bert Simpson (ro
0090: 62 65 72 74 40 62 6c 61 63 6b 63 61 73 74 6c 65  bert@blackcastle
00a0: 73 6f 66 74 2e 63 6f 6d 29 0d 0a 20 2a 20 0d 0a  soft.com).. * ..
00b0: 20 2a 20 52 65 6c 65 61 73 65 64 20 74 6f 20 74   * Released to t
00c0: 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69 6e  he public domain
00d0: 2c 20 75 73 65 20 61 74 20 79 6f 75 72 20 6f 77  , use at your ow
00e0: 6e 20 72 69 73 6b 21 0d 0a 20 2a 2a 2a 2a 2a 2a  n risk!.. ******
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2f 0d 0a 0d 0a 23 69 66 20 55 53 45 5f 45  **/....#if USE_E
0130: 4e 54 49 54 59 5f 46 52 41 4d 45 57 4f 52 4b 5f  NTITY_FRAMEWORK_
0140: 36 0d 0a 6e 61 6d 65 73 70 61 63 65 20 53 79 73  6..namespace Sys
0150: 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
0160: 45 46 36 0d 0a 23 65 6c 73 65 0d 0a 6e 61 6d 65  EF6..#else..name
0170: 73 70 61 63 65 20 53 79 73 74 65 6d 2e 44 61 74  space System.Dat
0180: 61 2e 53 51 4c 69 74 65 2e 4c 69 6e 71 0d 0a 23  a.SQLite.Linq..#
0190: 65 6e 64 69 66 0d 0a 7b 0d 0a 20 20 75 73 69 6e  endif..{..  usin
01a0: 67 20 53 79 73 74 65 6d 3b 0d 0a 20 20 75 73 69  g System;..  usi
01b0: 6e 67 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63  ng System.Collec
01c0: 74 69 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a  tions.Generic;..
01d0: 0d 0a 23 69 66 20 55 53 45 5f 45 4e 54 49 54 59  ..#if USE_ENTITY
01e0: 5f 46 52 41 4d 45 57 4f 52 4b 5f 36 0d 0a 20 20  _FRAMEWORK_6..  
01f0: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 44 61 74  using System.Dat
0200: 61 2e 45 6e 74 69 74 79 2e 43 6f 72 65 2e 43 6f  a.Entity.Core.Co
0210: 6d 6d 6f 6e 2e 43 6f 6d 6d 61 6e 64 54 72 65 65  mmon.CommandTree
0220: 73 3b 0d 0a 23 65 6c 73 65 0d 0a 20 20 75 73 69  s;..#else..  usi
0230: 6e 67 20 53 79 73 74 65 6d 2e 44 61 74 61 2e 43  ng System.Data.C
0240: 6f 6d 6d 6f 6e 2e 43 6f 6d 6d 61 6e 64 54 72 65  ommon.CommandTre
0250: 65 73 3b 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20  es;..#endif.... 
0260: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 65 61 6c     internal seal
0270: 65 64 20 63 6c 61 73 73 20 53 71 6c 43 68 65 63  ed class SqlChec
0280: 6b 65 72 20 3a 20 44 62 45 78 70 72 65 73 73 69  ker : DbExpressi
0290: 6f 6e 56 69 73 69 74 6f 72 3c 62 6f 6f 6c 3e 0d  onVisitor<bool>.
02a0: 0a 20 20 7b 0d 0a 23 69 66 20 66 61 6c 73 65 0d  .  {..#if false.
02b0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
02c0: 74 69 63 20 54 79 70 65 20 73 71 6c 38 72 65 77  tic Type sql8rew
02d0: 72 69 74 65 72 3b 0d 0a 0d 0a 20 20 20 20 73 74  riter;....    st
02e0: 61 74 69 63 20 53 71 6c 43 68 65 63 6b 65 72 28  atic SqlChecker(
02f0: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
0300: 20 20 73 74 72 69 6e 67 20 76 65 72 73 69 6f 6e    string version
0310: 20 3d 0d 0a 23 69 66 20 4e 45 54 5f 34 30 20 7c   =..#if NET_40 |
0320: 7c 20 4e 45 54 5f 34 35 20 7c 7c 20 4e 45 54 5f  | NET_45 || NET_
0330: 34 35 31 20 7c 7c 20 4e 45 54 5f 34 35 32 20 7c  451 || NET_452 |
0340: 7c 20 4e 45 54 5f 34 36 20 7c 7c 20 4e 45 54 5f  | NET_46 || NET_
0350: 34 36 31 20 7c 7c 20 4e 45 54 5f 34 36 32 20 7c  461 || NET_462 |
0360: 7c 20 4e 45 54 5f 34 37 20 7c 7c 20 4e 45 54 5f  | NET_47 || NET_
0370: 34 37 31 0d 0a 20 20 20 20 20 20 20 20 20 20 20  471..           
0380: 20 22 34 2e 30 2e 30 2e 30 22 3b 0d 0a 23 65 6c   "4.0.0.0";..#el
0390: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
03a0: 22 33 2e 35 2e 30 2e 30 22 3b 0d 0a 23 65 6e 64  "3.5.0.0";..#end
03b0: 69 66 0d 0a 0d 0a 20 20 20 20 20 20 20 20 73 71  if....        sq
03c0: 6c 38 72 65 77 72 69 74 65 72 20 3d 20 54 79 70  l8rewriter = Typ
03d0: 65 2e 47 65 74 54 79 70 65 28 53 74 72 69 6e 67  e.GetType(String
03e0: 2e 46 6f 72 6d 61 74 28 22 53 79 73 74 65 6d 2e  .Format("System.
03f0: 44 61 74 61 2e 53 71 6c 43 6c 69 65 6e 74 2e 53  Data.SqlClient.S
0400: 71 6c 47 65 6e 2e 53 71 6c 38 45 78 70 72 65 73  qlGen.Sql8Expres
0410: 73 69 6f 6e 52 65 77 72 69 74 65 72 2c 20 53 79  sionRewriter, Sy
0420: 73 74 65 6d 2e 44 61 74 61 2e 45 6e 74 69 74 79  stem.Data.Entity
0430: 2c 20 56 65 72 73 69 6f 6e 3d 7b 30 7d 2c 20 43  , Version={0}, C
0440: 75 6c 74 75 72 65 3d 6e 65 75 74 72 61 6c 2c 20  ulture=neutral, 
0450: 50 75 62 6c 69 63 4b 65 79 54 6f 6b 65 6e 3d 62  PublicKeyToken=b
0460: 37 37 61 35 63 35 36 31 39 33 34 65 30 38 39 22  77a5c561934e089"
0470: 2c 20 76 65 72 73 69 6f 6e 29 2c 20 66 61 6c 73  , version), fals
0480: 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64  e);..    }..#end
0490: 69 66 0d 0a 0d 0a 20 20 20 20 70 72 69 76 61 74  if....    privat
04a0: 65 20 53 71 6c 43 68 65 63 6b 65 72 28 29 0d 0a  e SqlChecker()..
04b0: 20 20 20 20 7b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a      {..    }....
04c0: 23 69 66 20 66 61 6c 73 65 0d 0a 20 20 20 20 2f  #if false..    /
04d0: 2f 2f 20 3c 73 75 6d 6d 61 72 79 3e 0d 0a 20 20  // <summary>..  
04e0: 20 20 2f 2f 2f 20 53 51 4c 69 74 65 20 64 6f 65    /// SQLite doe
04f0: 73 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  sn't support thi
0500: 6e 67 73 20 6c 69 6b 65 20 53 4b 49 50 20 61 6e  ngs like SKIP an
0510: 64 20 61 20 66 65 77 20 6f 74 68 65 72 20 74 68  d a few other th
0520: 69 6e 67 73 2e 20 20 0d 0a 20 20 20 20 2f 2f 2f  ings.  ..    ///
0530: 20 53 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   So determine if
0540: 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20 74   the query has t
0550: 6f 20 62 65 20 72 65 77 72 69 74 74 65 6e 0d 0a  o be rewritten..
0560: 20 20 20 20 2f 2f 2f 20 3c 2f 73 75 6d 6d 61 72      /// </summar
0570: 79 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 72 65 6d  y>..    /// <rem
0580: 61 72 6b 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 4d  arks>..    /// M
0590: 69 63 72 6f 73 6f 66 74 20 77 65 6e 74 20 74 6f  icrosoft went to
05a0: 20 61 6c 6c 20 74 68 65 20 74 72 6f 75 62 6c 65   all the trouble
05b0: 20 6f 66 20 6d 61 6b 69 6e 67 20 74 68 69 6e 67   of making thing
05c0: 73 20 6c 69 6b 65 20 53 4b 49 50 20 77 6f 72 6b  s like SKIP work
05d0: 20 0d 0a 20 20 20 20 2f 2f 2f 20 6f 6e 20 53 71   ..    /// on Sq
05e0: 6c 20 53 65 72 76 65 72 20 32 30 30 30 20 62 79  l Server 2000 by
05f0: 20 64 6f 69 6e 67 20 61 20 72 65 77 72 69 74 65   doing a rewrite
0600: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 74   of the commandt
0610: 72 65 65 2e 0d 0a 20 20 20 20 2f 2f 2f 20 48 6f  ree...    /// Ho
0620: 77 65 76 65 72 2c 20 61 6c 6c 20 74 68 61 74 20  wever, all that 
0630: 66 61 6e 63 79 20 73 74 75 66 66 20 69 73 20 68  fancy stuff is h
0640: 69 64 64 65 6e 20 66 72 6f 6d 20 75 73 2e 20 20  idden from us.  
0650: 54 68 61 6e 6b 73 20 74 6f 20 0d 0a 20 20 20 20  Thanks to ..    
0660: 2f 2f 2f 20 72 65 66 6c 65 63 74 69 6f 6e 20 68  /// reflection h
0670: 6f 77 65 76 65 72 2c 20 77 65 20 63 61 6e 20 67  owever, we can g
0680: 6f 20 61 68 65 61 64 20 61 6e 64 20 75 73 65 20  o ahead and use 
0690: 74 68 65 20 53 71 6c 20 32 30 30 30 20 72 65 77  the Sql 2000 rew
06a0: 72 69 74 65 72 20 63 6f 64 65 0d 0a 20 20 20 20  riter code..    
06b0: 2f 2f 2f 20 74 68 65 79 20 6d 61 64 65 2e 0d 0a  /// they made...
06c0: 20 20 20 20 2f 2f 2f 20 3c 2f 72 65 6d 61 72 6b      /// </remark
06d0: 73 3e 0d 0a 20 20 20 20 2f 2f 2f 20 3c 70 61 72  s>..    /// <par
06e0: 61 6d 20 6e 61 6d 65 3d 22 74 72 65 65 22 3e 54  am name="tree">T
06f0: 68 65 20 74 72 65 65 20 74 6f 20 69 6e 73 70 65  he tree to inspe
0700: 63 74 20 66 6f 72 20 61 20 72 65 77 72 69 74 65  ct for a rewrite
0710: 3c 2f 70 61 72 61 6d 3e 0d 0a 20 20 20 20 2f 2f  </param>..    //
0720: 2f 20 3c 72 65 74 75 72 6e 73 3e 52 65 74 75 72  / <returns>Retur
0730: 6e 73 20 61 20 6e 65 77 20 71 75 65 72 79 20 74  ns a new query t
0740: 72 65 65 20 69 66 20 69 74 20 6e 65 65 64 73 20  ree if it needs 
0750: 72 65 77 72 69 74 69 6e 67 3c 2f 72 65 74 75 72  rewriting</retur
0760: 6e 73 3e 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61  ns>..    interna
0770: 6c 20 73 74 61 74 69 63 20 44 62 51 75 65 72 79  l static DbQuery
0780: 43 6f 6d 6d 61 6e 64 54 72 65 65 20 52 65 77 72  CommandTree Rewr
0790: 69 74 65 28 44 62 51 75 65 72 79 43 6f 6d 6d 61  ite(DbQueryComma
07a0: 6e 64 54 72 65 65 20 74 72 65 65 29 0d 0a 20 20  ndTree tree)..  
07b0: 20 20 7b 0d 0a 20 20 20 20 20 20 53 71 6c 43 68    {..      SqlCh
07c0: 65 63 6b 65 72 20 76 69 73 69 74 6f 72 20 3d 20  ecker visitor = 
07d0: 6e 65 77 20 53 71 6c 43 68 65 63 6b 65 72 28 29  new SqlChecker()
07e0: 3b 0d 0a 20 20 20 20 20 20 69 66 20 28 74 72 65  ;..      if (tre
07f0: 65 2e 51 75 65 72 79 2e 41 63 63 65 70 74 3c 62  e.Query.Accept<b
0800: 6f 6f 6c 3e 28 76 69 73 69 74 6f 72 29 29 0d 0a  ool>(visitor))..
0810: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
0820: 20 74 72 65 65 20 3d 20 73 71 6c 38 72 65 77 72   tree = sql8rewr
0830: 69 74 65 72 2e 49 6e 76 6f 6b 65 4d 65 6d 62 65  iter.InvokeMembe
0840: 72 28 22 52 65 77 72 69 74 65 22 2c 20 53 79 73  r("Rewrite", Sys
0850: 74 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 2e 42  tem.Reflection.B
0860: 69 6e 64 69 6e 67 46 6c 61 67 73 2e 4e 6f 6e 50  indingFlags.NonP
0870: 75 62 6c 69 63 20 7c 20 53 79 73 74 65 6d 2e 52  ublic | System.R
0880: 65 66 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e  eflection.Bindin
0890: 67 46 6c 61 67 73 2e 49 6e 76 6f 6b 65 4d 65 74  gFlags.InvokeMet
08a0: 68 6f 64 20 7c 20 53 79 73 74 65 6d 2e 52 65 66  hod | System.Ref
08b0: 6c 65 63 74 69 6f 6e 2e 42 69 6e 64 69 6e 67 46  lection.BindingF
08c0: 6c 61 67 73 2e 53 74 61 74 69 63 2c 20 6e 75 6c  lags.Static, nul
08d0: 6c 2c 20 6e 75 6c 6c 2c 20 6e 65 77 20 6f 62 6a  l, null, new obj
08e0: 65 63 74 5b 5d 20 7b 20 74 72 65 65 20 7d 29 20  ect[] { tree }) 
08f0: 61 73 20 44 62 51 75 65 72 79 43 6f 6d 6d 61 6e  as DbQueryComman
0900: 64 54 72 65 65 3b 0d 0a 20 20 20 20 20 20 7d 20  dTree;..      } 
0910: 20 20 20 20 20 0d 0a 20 20 20 20 20 20 72 65 74       ..      ret
0920: 75 72 6e 20 74 72 65 65 3b 0d 0a 20 20 20 20 7d  urn tree;..    }
0930: 0d 0a 23 65 6e 64 69 66 0d 0a 0d 0a 20 20 20 20  ..#endif....    
0940: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
0950: 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 41 6e 64  bool Visit(DbAnd
0960: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
0970: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssion)..    {.. 
0980: 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69       return Visi
0990: 74 42 69 6e 61 72 79 45 78 70 72 65 73 73 69 6f  tBinaryExpressio
09a0: 6e 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a  n(expression);..
09b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
09c0: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  lic override boo
09d0: 6c 20 56 69 73 69 74 28 44 62 41 70 70 6c 79 45  l Visit(DbApplyE
09e0: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
09f0: 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  sion)..    {..  
0a00: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 4e 6f      throw new No
0a10: 74 53 75 70 70 6f 72 74 65 64 45 78 63 65 70 74  tSupportedExcept
0a20: 69 6f 6e 28 22 61 70 70 6c 79 20 65 78 70 72 65  ion("apply expre
0a30: 73 73 69 6f 6e 22 29 3b 0d 0a 20 20 20 20 7d 0d  ssion");..    }.
0a40: 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  ...    public ov
0a50: 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69  erride bool Visi
0a60: 74 28 44 62 41 72 69 74 68 6d 65 74 69 63 45 78  t(DbArithmeticEx
0a70: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
0a80: 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
0a90: 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 45     return VisitE
0aa0: 78 70 72 65 73 73 69 6f 6e 4c 69 73 74 28 65 78  xpressionList(ex
0ab0: 70 72 65 73 73 69 6f 6e 2e 41 72 67 75 6d 65 6e  pression.Argumen
0ac0: 74 73 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20  ts);..    }.... 
0ad0: 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69     public overri
0ae0: 64 65 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62  de bool Visit(Db
0af0: 43 61 73 65 45 78 70 72 65 73 73 69 6f 6e 20 65  CaseExpression e
0b00: 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
0b10: 7b 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c  {..      bool fl
0b20: 61 67 31 20 3d 20 56 69 73 69 74 45 78 70 72 65  ag1 = VisitExpre
0b30: 73 73 69 6f 6e 4c 69 73 74 28 65 78 70 72 65 73  ssionList(expres
0b40: 73 69 6f 6e 2e 57 68 65 6e 29 3b 0d 0a 20 20 20  sion.When);..   
0b50: 20 20 20 62 6f 6f 6c 20 66 6c 61 67 32 20 3d 20     bool flag2 = 
0b60: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 4c  VisitExpressionL
0b70: 69 73 74 28 65 78 70 72 65 73 73 69 6f 6e 2e 54  ist(expression.T
0b80: 68 65 6e 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f  hen);..      boo
0b90: 6c 20 66 6c 61 67 33 20 3d 20 56 69 73 69 74 45  l flag3 = VisitE
0ba0: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
0bb0: 73 69 6f 6e 2e 45 6c 73 65 29 3b 0d 0a 0d 0a 20  sion.Else);.... 
0bc0: 20 20 20 20 20 72 65 74 75 72 6e 20 28 66 6c 61       return (fla
0bd0: 67 31 20 7c 7c 20 66 6c 61 67 32 20 7c 7c 20 66  g1 || flag2 || f
0be0: 6c 61 67 33 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  lag3);..    }...
0bf0: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
0c00: 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69 74 28  ride bool Visit(
0c10: 44 62 43 61 73 74 45 78 70 72 65 73 73 69 6f 6e  DbCastExpression
0c20: 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20   expression)..  
0c30: 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72    {..      retur
0c40: 6e 20 56 69 73 69 74 55 6e 61 72 79 45 78 70 72  n VisitUnaryExpr
0c50: 65 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f  ession(expressio
0c60: 6e 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  n);..    }....  
0c70: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
0c80: 65 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 43  e bool Visit(DbC
0c90: 6f 6d 70 61 72 69 73 6f 6e 45 78 70 72 65 73 73  omparisonExpress
0ca0: 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d  ion expression).
0cb0: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
0cc0: 74 75 72 6e 20 56 69 73 69 74 42 69 6e 61 72 79  turn VisitBinary
0cd0: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
0ce0: 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ssion);..    }..
0cf0: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
0d00: 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69 74  rride bool Visit
0d10: 28 44 62 43 6f 6e 73 74 61 6e 74 45 78 70 72 65  (DbConstantExpre
0d20: 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssion expression
0d30: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
0d40: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
0d50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c     }....    publ
0d60: 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c  ic override bool
0d70: 20 56 69 73 69 74 28 44 62 43 72 6f 73 73 4a 6f   Visit(DbCrossJo
0d80: 69 6e 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70  inExpression exp
0d90: 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d  ression)..    {.
0da0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 56 69  .      return Vi
0db0: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e  sitExpressionBin
0dc0: 64 69 6e 67 4c 69 73 74 28 65 78 70 72 65 73 73  dingList(express
0dd0: 69 6f 6e 2e 49 6e 70 75 74 73 29 3b 0d 0a 20 20  ion.Inputs);..  
0de0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69    }....    publi
0df0: 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20  c override bool 
0e00: 56 69 73 69 74 28 44 62 44 65 72 65 66 45 78 70  Visit(DbDerefExp
0e10: 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
0e20: 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  on)..    {..    
0e30: 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 55 6e    return VisitUn
0e40: 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65 78  aryExpression(ex
0e50: 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20  pression);..    
0e60: 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  }....    public 
0e70: 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69  override bool Vi
0e80: 73 69 74 28 44 62 44 69 73 74 69 6e 63 74 45 78  sit(DbDistinctEx
0e90: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
0ea0: 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
0eb0: 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 55     return VisitU
0ec0: 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65  naryExpression(e
0ed0: 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20  xpression);..   
0ee0: 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63   }....    public
0ef0: 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56   override bool V
0f00: 69 73 69 74 28 44 62 45 6c 65 6d 65 6e 74 45 78  isit(DbElementEx
0f10: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
0f20: 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
0f30: 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 55     return VisitU
0f40: 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65  naryExpression(e
0f50: 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20  xpression);..   
0f60: 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63   }....    public
0f70: 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56   override bool V
0f80: 69 73 69 74 28 44 62 45 6e 74 69 74 79 52 65 66  isit(DbEntityRef
0f90: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
0fa0: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssion)..    {.. 
0fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69       return Visi
0fc0: 74 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e  tUnaryExpression
0fd0: 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20  (expression);.. 
0fe0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c     }....    publ
0ff0: 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c  ic override bool
1000: 20 56 69 73 69 74 28 44 62 45 78 63 65 70 74 45   Visit(DbExceptE
1010: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
1020: 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  sion)..    {..  
1030: 20 20 20 20 62 6f 6f 6c 20 66 6c 61 67 31 20 3d      bool flag1 =
1040: 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e   VisitExpression
1050: 28 65 78 70 72 65 73 73 69 6f 6e 2e 4c 65 66 74  (expression.Left
1060: 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66  );..      bool f
1070: 6c 61 67 32 20 3d 20 56 69 73 69 74 45 78 70 72  lag2 = VisitExpr
1080: 65 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f  ession(expressio
1090: 6e 2e 52 69 67 68 74 29 3b 0d 0a 20 20 20 20 20  n.Right);..     
10a0: 20 72 65 74 75 72 6e 20 28 66 6c 61 67 31 20 7c   return (flag1 |
10b0: 7c 20 66 6c 61 67 32 29 3b 0d 0a 20 20 20 20 7d  | flag2);..    }
10c0: 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  ....    public o
10d0: 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73  verride bool Vis
10e0: 69 74 28 44 62 45 78 70 72 65 73 73 69 6f 6e 20  it(DbExpression 
10f0: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
1100: 20 7b 0d 0a 20 20 20 20 20 20 74 68 72 6f 77 20   {..      throw 
1110: 6e 65 77 20 4e 6f 74 53 75 70 70 6f 72 74 65 64  new NotSupported
1120: 45 78 63 65 70 74 69 6f 6e 28 65 78 70 72 65 73  Exception(expres
1130: 73 69 6f 6e 2e 47 65 74 54 79 70 65 28 29 2e 46  sion.GetType().F
1140: 75 6c 6c 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 7d  ullName);..    }
1150: 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f  ....    public o
1160: 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73  verride bool Vis
1170: 69 74 28 44 62 46 69 6c 74 65 72 45 78 70 72 65  it(DbFilterExpre
1180: 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssion expression
1190: 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  )..    {..      
11a0: 62 6f 6f 6c 20 66 6c 61 67 31 20 3d 20 56 69 73  bool flag1 = Vis
11b0: 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64  itExpressionBind
11c0: 69 6e 67 28 65 78 70 72 65 73 73 69 6f 6e 2e 49  ing(expression.I
11d0: 6e 70 75 74 29 3b 0d 0a 20 20 20 20 20 20 62 6f  nput);..      bo
11e0: 6f 6c 20 66 6c 61 67 32 20 3d 20 56 69 73 69 74  ol flag2 = Visit
11f0: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
1200: 73 73 69 6f 6e 2e 50 72 65 64 69 63 61 74 65 29  ssion.Predicate)
1210: 3b 0d 0a 0d 0a 20 20 20 20 20 20 72 65 74 75 72  ;....      retur
1220: 6e 20 28 66 6c 61 67 31 20 7c 7c 20 66 6c 61 67  n (flag1 || flag
1230: 32 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  2);..    }....  
1240: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
1250: 65 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 46  e bool Visit(DbF
1260: 75 6e 63 74 69 6f 6e 45 78 70 72 65 73 73 69 6f  unctionExpressio
1270: 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20  n expression).. 
1280: 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75     {..      retu
1290: 72 6e 20 56 69 73 69 74 45 78 70 72 65 73 73 69  rn VisitExpressi
12a0: 6f 6e 4c 69 73 74 28 65 78 70 72 65 73 73 69 6f  onList(expressio
12b0: 6e 2e 41 72 67 75 6d 65 6e 74 73 29 3b 0d 0a 20  n.Arguments);.. 
12c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c     }....    publ
12d0: 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c  ic override bool
12e0: 20 56 69 73 69 74 28 44 62 47 72 6f 75 70 42 79   Visit(DbGroupBy
12f0: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
1300: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssion)..    {.. 
1310: 20 20 20 20 20 62 6f 6f 6c 20 66 6c 61 67 31 20       bool flag1 
1320: 3d 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f  = VisitExpressio
1330: 6e 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70  n(expression.Inp
1340: 75 74 2e 45 78 70 72 65 73 73 69 6f 6e 29 3b 0d  ut.Expression);.
1350: 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c 61 67  .      bool flag
1360: 32 20 3d 20 56 69 73 69 74 45 78 70 72 65 73 73  2 = VisitExpress
1370: 69 6f 6e 4c 69 73 74 28 65 78 70 72 65 73 73 69  ionList(expressi
1380: 6f 6e 2e 4b 65 79 73 29 3b 0d 0a 20 20 20 20 20  on.Keys);..     
1390: 20 62 6f 6f 6c 20 66 6c 61 67 33 20 3d 20 56 69   bool flag3 = Vi
13a0: 73 69 74 41 67 67 72 65 67 61 74 65 4c 69 73 74  sitAggregateList
13b0: 28 65 78 70 72 65 73 73 69 6f 6e 2e 41 67 67 72  (expression.Aggr
13c0: 65 67 61 74 65 73 29 3b 0d 0a 0d 0a 20 20 20 20  egates);....    
13d0: 20 20 72 65 74 75 72 6e 20 28 66 6c 61 67 31 20    return (flag1 
13e0: 7c 7c 20 66 6c 61 67 32 20 7c 7c 20 66 6c 61 67  || flag2 || flag
13f0: 33 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20  3);..    }....  
1400: 20 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64    public overrid
1410: 65 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 49  e bool Visit(DbI
1420: 6e 74 65 72 73 65 63 74 45 78 70 72 65 73 73 69  ntersectExpressi
1430: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a  on expression)..
1440: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 62 6f 6f      {..      boo
1450: 6c 20 66 6c 61 67 31 20 3d 20 56 69 73 69 74 45  l flag1 = VisitE
1460: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
1470: 73 69 6f 6e 2e 4c 65 66 74 29 3b 0d 0a 20 20 20  sion.Left);..   
1480: 20 20 20 62 6f 6f 6c 20 66 6c 61 67 32 20 3d 20     bool flag2 = 
1490: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28  VisitExpression(
14a0: 65 78 70 72 65 73 73 69 6f 6e 2e 52 69 67 68 74  expression.Right
14b0: 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
14c0: 20 28 66 6c 61 67 31 20 7c 7c 20 66 6c 61 67 32   (flag1 || flag2
14d0: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
14e0: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
14f0: 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 49 73   bool Visit(DbIs
1500: 45 6d 70 74 79 45 78 70 72 65 73 73 69 6f 6e 20  EmptyExpression 
1510: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
1520: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1530: 20 56 69 73 69 74 55 6e 61 72 79 45 78 70 72 65   VisitUnaryExpre
1540: 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e  ssion(expression
1550: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
1560: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
1570: 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 49 73   bool Visit(DbIs
1580: 4e 75 6c 6c 45 78 70 72 65 73 73 69 6f 6e 20 65  NullExpression e
1590: 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
15a0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
15b0: 56 69 73 69 74 55 6e 61 72 79 45 78 70 72 65 73  VisitUnaryExpres
15c0: 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e 29  sion(expression)
15d0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
15e0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
15f0: 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 49 73 4f  bool Visit(DbIsO
1600: 66 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  fExpression expr
1610: 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a  ession)..    {..
1620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73        return Vis
1630: 69 74 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f  itUnaryExpressio
1640: 6e 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a  n(expression);..
1650: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
1660: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  lic override boo
1670: 6c 20 56 69 73 69 74 28 44 62 4a 6f 69 6e 45 78  l Visit(DbJoinEx
1680: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
1690: 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
16a0: 20 20 20 62 6f 6f 6c 20 66 6c 61 67 31 20 3d 20     bool flag1 = 
16b0: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42  VisitExpressionB
16c0: 69 6e 64 69 6e 67 28 65 78 70 72 65 73 73 69 6f  inding(expressio
16d0: 6e 2e 4c 65 66 74 29 3b 0d 0a 20 20 20 20 20 20  n.Left);..      
16e0: 62 6f 6f 6c 20 66 6c 61 67 32 20 3d 20 56 69 73  bool flag2 = Vis
16f0: 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64  itExpressionBind
1700: 69 6e 67 28 65 78 70 72 65 73 73 69 6f 6e 2e 52  ing(expression.R
1710: 69 67 68 74 29 3b 0d 0a 20 20 20 20 20 20 62 6f  ight);..      bo
1720: 6f 6c 20 66 6c 61 67 33 20 3d 20 56 69 73 69 74  ol flag3 = Visit
1730: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
1740: 73 73 69 6f 6e 2e 4a 6f 69 6e 43 6f 6e 64 69 74  ssion.JoinCondit
1750: 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 72 65 74  ion);..      ret
1760: 75 72 6e 20 28 66 6c 61 67 31 20 7c 7c 20 66 6c  urn (flag1 || fl
1770: 61 67 32 20 7c 7c 20 66 6c 61 67 33 29 3b 0d 0a  ag2 || flag3);..
1780: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
1790: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  lic override boo
17a0: 6c 20 56 69 73 69 74 28 44 62 4c 69 6b 65 45 78  l Visit(DbLikeEx
17b0: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
17c0: 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
17d0: 20 20 20 62 6f 6f 6c 20 66 6c 61 67 31 20 3d 20     bool flag1 = 
17e0: 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28  VisitExpression(
17f0: 65 78 70 72 65 73 73 69 6f 6e 2e 41 72 67 75 6d  expression.Argum
1800: 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f  ent);..      boo
1810: 6c 20 66 6c 61 67 32 20 3d 20 56 69 73 69 74 45  l flag2 = VisitE
1820: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
1830: 73 69 6f 6e 2e 50 61 74 74 65 72 6e 29 3b 0d 0a  sion.Pattern);..
1840: 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c 61 67 33        bool flag3
1850: 20 3d 20 56 69 73 69 74 45 78 70 72 65 73 73 69   = VisitExpressi
1860: 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e 2e 45 73  on(expression.Es
1870: 63 61 70 65 29 3b 0d 0a 20 20 20 20 20 20 72 65  cape);..      re
1880: 74 75 72 6e 20 28 66 6c 61 67 31 20 7c 7c 20 66  turn (flag1 || f
1890: 6c 61 67 32 20 7c 7c 20 66 6c 61 67 33 29 3b 0d  lag2 || flag3);.
18a0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75  .    }....    pu
18b0: 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f  blic override bo
18c0: 6f 6c 20 56 69 73 69 74 28 44 62 4c 69 6d 69 74  ol Visit(DbLimit
18d0: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
18e0: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssion)..    {.. 
18f0: 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69       return Visi
1900: 74 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72  tExpression(expr
1910: 65 73 73 69 6f 6e 2e 41 72 67 75 6d 65 6e 74 29  ession.Argument)
1920: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1930: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
1940: 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 4e 65 77  bool Visit(DbNew
1950: 49 6e 73 74 61 6e 63 65 45 78 70 72 65 73 73 69  InstanceExpressi
1960: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a  on expression)..
1970: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
1980: 75 72 6e 20 56 69 73 69 74 45 78 70 72 65 73 73  urn VisitExpress
1990: 69 6f 6e 4c 69 73 74 28 65 78 70 72 65 73 73 69  ionList(expressi
19a0: 6f 6e 2e 41 72 67 75 6d 65 6e 74 73 29 3b 0d 0a  on.Arguments);..
19b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
19c0: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  lic override boo
19d0: 6c 20 56 69 73 69 74 28 44 62 4e 6f 74 45 78 70  l Visit(DbNotExp
19e0: 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69  ression expressi
19f0: 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20  on)..    {..    
1a00: 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 55 6e    return VisitUn
1a10: 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65 78  aryExpression(ex
1a20: 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20  pression);..    
1a30: 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  }....    public 
1a40: 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69  override bool Vi
1a50: 73 69 74 28 44 62 4e 75 6c 6c 45 78 70 72 65 73  sit(DbNullExpres
1a60: 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29  sion expression)
1a70: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72  ..    {..      r
1a80: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
1a90: 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69    }....    publi
1aa0: 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20  c override bool 
1ab0: 56 69 73 69 74 28 44 62 4f 66 54 79 70 65 45 78  Visit(DbOfTypeEx
1ac0: 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73  pression express
1ad0: 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  ion)..    {..   
1ae0: 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 55     return VisitU
1af0: 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e 28 65  naryExpression(e
1b00: 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20 20 20  xpression);..   
1b10: 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63   }....    public
1b20: 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56   override bool V
1b30: 69 73 69 74 28 44 62 4f 72 45 78 70 72 65 73 73  isit(DbOrExpress
1b40: 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d  ion expression).
1b50: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
1b60: 74 75 72 6e 20 56 69 73 69 74 42 69 6e 61 72 79  turn VisitBinary
1b70: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
1b80: 73 73 69 6f 6e 29 3b 0d 0a 20 20 20 20 7d 0d 0a  ssion);..    }..
1b90: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
1ba0: 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69 74  rride bool Visit
1bb0: 28 44 62 50 61 72 61 6d 65 74 65 72 52 65 66 65  (DbParameterRefe
1bc0: 72 65 6e 63 65 45 78 70 72 65 73 73 69 6f 6e 20  renceExpression 
1bd0: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
1be0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1bf0: 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 7d 0d 0a   false;..    }..
1c00: 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65  ..    public ove
1c10: 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69 74  rride bool Visit
1c20: 28 44 62 50 72 6f 6a 65 63 74 45 78 70 72 65 73  (DbProjectExpres
1c30: 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29  sion expression)
1c40: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 62  ..    {..      b
1c50: 6f 6f 6c 20 66 6c 61 67 31 20 3d 20 56 69 73 69  ool flag1 = Visi
1c60: 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69  tExpressionBindi
1c70: 6e 67 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e  ng(expression.In
1c80: 70 75 74 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f  put);..      boo
1c90: 6c 20 66 6c 61 67 32 20 3d 20 56 69 73 69 74 45  l flag2 = VisitE
1ca0: 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65 73  xpression(expres
1cb0: 73 69 6f 6e 2e 50 72 6f 6a 65 63 74 69 6f 6e 29  sion.Projection)
1cc0: 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;..      return 
1cd0: 28 66 6c 61 67 31 20 7c 7c 20 66 6c 61 67 32 29  (flag1 || flag2)
1ce0: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
1cf0: 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20  public override 
1d00: 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 50 72 6f  bool Visit(DbPro
1d10: 70 65 72 74 79 45 78 70 72 65 73 73 69 6f 6e 20  pertyExpression 
1d20: 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20  expression)..   
1d30: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
1d40: 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e   VisitExpression
1d50: 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 73 74  (expression.Inst
1d60: 61 6e 63 65 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  ance);..    }...
1d70: 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76 65 72  .    public over
1d80: 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69 74 28  ride bool Visit(
1d90: 44 62 51 75 61 6e 74 69 66 69 65 72 45 78 70 72  DbQuantifierExpr
1da0: 65 73 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f  ession expressio
1db0: 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  n)..    {..     
1dc0: 20 62 6f 6f 6c 20 66 6c 61 67 31 20 3d 20 56 69   bool flag1 = Vi
1dd0: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e  sitExpressionBin
1de0: 64 69 6e 67 28 65 78 70 72 65 73 73 69 6f 6e 2e  ding(expression.
1df0: 49 6e 70 75 74 29 3b 0d 0a 20 20 20 20 20 20 62  Input);..      b
1e00: 6f 6f 6c 20 66 6c 61 67 32 20 3d 20 56 69 73 69  ool flag2 = Visi
1e10: 74 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72  tExpression(expr
1e20: 65 73 73 69 6f 6e 2e 50 72 65 64 69 63 61 74 65  ession.Predicate
1e30: 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
1e40: 20 28 66 6c 61 67 31 20 7c 7c 20 66 6c 61 67 32   (flag1 || flag2
1e50: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
1e60: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
1e70: 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 52 65   bool Visit(DbRe
1e80: 66 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72  fExpression expr
1e90: 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a  ession)..    {..
1ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73        return Vis
1eb0: 69 74 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f  itUnaryExpressio
1ec0: 6e 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a  n(expression);..
1ed0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62      }....    pub
1ee0: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f  lic override boo
1ef0: 6c 20 56 69 73 69 74 28 44 62 52 65 66 4b 65 79  l Visit(DbRefKey
1f00: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
1f10: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssion)..    {.. 
1f20: 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69       return Visi
1f30: 74 55 6e 61 72 79 45 78 70 72 65 73 73 69 6f 6e  tUnaryExpression
1f40: 28 65 78 70 72 65 73 73 69 6f 6e 29 3b 0d 0a 20  (expression);.. 
1f50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c     }....    publ
1f60: 69 63 20 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c  ic override bool
1f70: 20 56 69 73 69 74 28 44 62 52 65 6c 61 74 69 6f   Visit(DbRelatio
1f80: 6e 73 68 69 70 4e 61 76 69 67 61 74 69 6f 6e 45  nshipNavigationE
1f90: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
1fa0: 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  sion)..    {..  
1fb0: 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74      return Visit
1fc0: 45 78 70 72 65 73 73 69 6f 6e 28 65 78 70 72 65  Expression(expre
1fd0: 73 73 69 6f 6e 2e 4e 61 76 69 67 61 74 69 6f 6e  ssion.Navigation
1fe0: 53 6f 75 72 63 65 29 3b 0d 0a 20 20 20 20 7d 0d  Source);..    }.
1ff0: 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  ...    public ov
2000: 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69  erride bool Visi
2010: 74 28 44 62 53 63 61 6e 45 78 70 72 65 73 73 69  t(DbScanExpressi
2020: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a  on expression)..
2030: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74      {..      ret
2040: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
2050: 7d 0d 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20  }....    public 
2060: 6f 76 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69  override bool Vi
2070: 73 69 74 28 44 62 53 6b 69 70 45 78 70 72 65 73  sit(DbSkipExpres
2080: 73 69 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29  sion expression)
2090: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 56  ..    {..      V
20a0: 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69  isitExpressionBi
20b0: 6e 64 69 6e 67 28 65 78 70 72 65 73 73 69 6f 6e  nding(expression
20c0: 2e 49 6e 70 75 74 29 3b 0d 0a 20 20 20 20 20 20  .Input);..      
20d0: 56 69 73 69 74 53 6f 72 74 43 6c 61 75 73 65 4c  VisitSortClauseL
20e0: 69 73 74 28 65 78 70 72 65 73 73 69 6f 6e 2e 53  ist(expression.S
20f0: 6f 72 74 4f 72 64 65 72 29 3b 0d 0a 20 20 20 20  ortOrder);..    
2100: 20 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f    VisitExpressio
2110: 6e 28 65 78 70 72 65 73 73 69 6f 6e 2e 43 6f 75  n(expression.Cou
2120: 6e 74 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75  nt);..      retu
2130: 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 7d 0d  rn true;..    }.
2140: 0a 0d 0a 20 20 20 20 70 75 62 6c 69 63 20 6f 76  ...    public ov
2150: 65 72 72 69 64 65 20 62 6f 6f 6c 20 56 69 73 69  erride bool Visi
2160: 74 28 44 62 53 6f 72 74 45 78 70 72 65 73 73 69  t(DbSortExpressi
2170: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 29 0d 0a  on expression)..
2180: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 62 6f 6f      {..      boo
2190: 6c 20 66 6c 61 67 31 20 3d 20 56 69 73 69 74 45  l flag1 = VisitE
21a0: 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67  xpressionBinding
21b0: 28 65 78 70 72 65 73 73 69 6f 6e 2e 49 6e 70 75  (expression.Inpu
21c0: 74 29 3b 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20  t);..      bool 
21d0: 66 6c 61 67 32 20 3d 20 56 69 73 69 74 53 6f 72  flag2 = VisitSor
21e0: 74 43 6c 61 75 73 65 4c 69 73 74 28 65 78 70 72  tClauseList(expr
21f0: 65 73 73 69 6f 6e 2e 53 6f 72 74 4f 72 64 65 72  ession.SortOrder
2200: 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
2210: 20 28 66 6c 61 67 31 20 7c 7c 20 66 6c 61 67 32   (flag1 || flag2
2220: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
2230: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
2240: 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 54 72   bool Visit(DbTr
2250: 65 61 74 45 78 70 72 65 73 73 69 6f 6e 20 65 78  eatExpression ex
2260: 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b  pression)..    {
2270: 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 56  ..      return V
2280: 69 73 69 74 55 6e 61 72 79 45 78 70 72 65 73 73  isitUnaryExpress
2290: 69 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e 29 3b  ion(expression);
22a0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
22b0: 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65 20 62  ublic override b
22c0: 6f 6f 6c 20 56 69 73 69 74 28 44 62 55 6e 69 6f  ool Visit(DbUnio
22d0: 6e 41 6c 6c 45 78 70 72 65 73 73 69 6f 6e 20 65  nAllExpression e
22e0: 78 70 72 65 73 73 69 6f 6e 29 0d 0a 20 20 20 20  xpression)..    
22f0: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
2300: 56 69 73 69 74 42 69 6e 61 72 79 45 78 70 72 65  VisitBinaryExpre
2310: 73 73 69 6f 6e 28 65 78 70 72 65 73 73 69 6f 6e  ssion(expression
2320: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
2330: 20 70 75 62 6c 69 63 20 6f 76 65 72 72 69 64 65   public override
2340: 20 62 6f 6f 6c 20 56 69 73 69 74 28 44 62 56 61   bool Visit(DbVa
2350: 72 69 61 62 6c 65 52 65 66 65 72 65 6e 63 65 45  riableReferenceE
2360: 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65 73  xpression expres
2370: 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20 20  sion)..    {..  
2380: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
2390: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
23a0: 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69 73  private bool Vis
23b0: 69 74 41 67 67 72 65 67 61 74 65 28 44 62 41 67  itAggregate(DbAg
23c0: 67 72 65 67 61 74 65 20 61 67 67 72 65 67 61 74  gregate aggregat
23d0: 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20  e)..    {..     
23e0: 20 72 65 74 75 72 6e 20 56 69 73 69 74 45 78 70   return VisitExp
23f0: 72 65 73 73 69 6f 6e 4c 69 73 74 28 61 67 67 72  ressionList(aggr
2400: 65 67 61 74 65 2e 41 72 67 75 6d 65 6e 74 73 29  egate.Arguments)
2410: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
2420: 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69 73  private bool Vis
2430: 69 74 41 67 67 72 65 67 61 74 65 4c 69 73 74 28  itAggregateList(
2440: 49 4c 69 73 74 3c 44 62 41 67 67 72 65 67 61 74  IList<DbAggregat
2450: 65 3e 20 6c 69 73 74 29 0d 0a 20 20 20 20 7b 0d  e> list)..    {.
2460: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 56 69  .      return Vi
2470: 73 69 74 4c 69 73 74 3c 44 62 41 67 67 72 65 67  sitList<DbAggreg
2480: 61 74 65 3e 28 6e 65 77 20 4c 69 73 74 45 6c 65  ate>(new ListEle
2490: 6d 65 6e 74 48 61 6e 64 6c 65 72 3c 44 62 41 67  mentHandler<DbAg
24a0: 67 72 65 67 61 74 65 3e 28 56 69 73 69 74 41 67  gregate>(VisitAg
24b0: 67 72 65 67 61 74 65 29 2c 20 6c 69 73 74 29 3b  gregate), list);
24c0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
24d0: 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69 73 69  rivate bool Visi
24e0: 74 42 69 6e 61 72 79 45 78 70 72 65 73 73 69 6f  tBinaryExpressio
24f0: 6e 28 44 62 42 69 6e 61 72 79 45 78 70 72 65 73  n(DbBinaryExpres
2500: 73 69 6f 6e 20 65 78 70 72 29 0d 0a 20 20 20 20  sion expr)..    
2510: 7b 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c  {..      bool fl
2520: 61 67 31 20 3d 20 56 69 73 69 74 45 78 70 72 65  ag1 = VisitExpre
2530: 73 73 69 6f 6e 28 65 78 70 72 2e 4c 65 66 74 29  ssion(expr.Left)
2540: 3b 0d 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c  ;..      bool fl
2550: 61 67 32 20 3d 20 56 69 73 69 74 45 78 70 72 65  ag2 = VisitExpre
2560: 73 73 69 6f 6e 28 65 78 70 72 2e 52 69 67 68 74  ssion(expr.Right
2570: 29 3b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e  );..      return
2580: 20 28 66 6c 61 67 31 20 7c 7c 20 66 6c 61 67 32   (flag1 || flag2
2590: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
25a0: 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69   private bool Vi
25b0: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 28 44 62  sitExpression(Db
25c0: 45 78 70 72 65 73 73 69 6f 6e 20 65 78 70 72 65  Expression expre
25d0: 73 73 69 6f 6e 29 0d 0a 20 20 20 20 7b 0d 0a 20  ssion)..    {.. 
25e0: 20 20 20 20 20 69 66 20 28 65 78 70 72 65 73 73       if (express
25f0: 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ion == null)..  
2600: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 72      {..        r
2610: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
2620: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 72 65 74      }..      ret
2630: 75 72 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 41  urn expression.A
2640: 63 63 65 70 74 3c 62 6f 6f 6c 3e 28 74 68 69 73  ccept<bool>(this
2650: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
2660: 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69   private bool Vi
2670: 73 69 74 45 78 70 72 65 73 73 69 6f 6e 42 69 6e  sitExpressionBin
2680: 64 69 6e 67 28 44 62 45 78 70 72 65 73 73 69 6f  ding(DbExpressio
2690: 6e 42 69 6e 64 69 6e 67 20 65 78 70 72 65 73 73  nBinding express
26a0: 69 6f 6e 42 69 6e 64 69 6e 67 29 0d 0a 20 20 20  ionBinding)..   
26b0: 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e   {..      return
26c0: 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f 6e   VisitExpression
26d0: 28 65 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69  (expressionBindi
26e0: 6e 67 2e 45 78 70 72 65 73 73 69 6f 6e 29 3b 0d  ng.Expression);.
26f0: 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70 72  .    }....    pr
2700: 69 76 61 74 65 20 62 6f 6f 6c 20 56 69 73 69 74  ivate bool Visit
2710: 45 78 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e  ExpressionBindin
2720: 67 4c 69 73 74 28 49 4c 69 73 74 3c 44 62 45 78  gList(IList<DbEx
2730: 70 72 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 3e  pressionBinding>
2740: 20 6c 69 73 74 29 0d 0a 20 20 20 20 7b 0d 0a 20   list)..    {.. 
2750: 20 20 20 20 20 72 65 74 75 72 6e 20 56 69 73 69       return Visi
2760: 74 4c 69 73 74 3c 44 62 45 78 70 72 65 73 73 69  tList<DbExpressi
2770: 6f 6e 42 69 6e 64 69 6e 67 3e 28 6e 65 77 20 4c  onBinding>(new L
2780: 69 73 74 45 6c 65 6d 65 6e 74 48 61 6e 64 6c 65  istElementHandle
2790: 72 3c 44 62 45 78 70 72 65 73 73 69 6f 6e 42 69  r<DbExpressionBi
27a0: 6e 64 69 6e 67 3e 28 56 69 73 69 74 45 78 70 72  nding>(VisitExpr
27b0: 65 73 73 69 6f 6e 42 69 6e 64 69 6e 67 29 2c 20  essionBinding), 
27c0: 6c 69 73 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d  list);..    }...
27d0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f  .    private boo
27e0: 6c 20 56 69 73 69 74 45 78 70 72 65 73 73 69 6f  l VisitExpressio
27f0: 6e 4c 69 73 74 28 49 4c 69 73 74 3c 44 62 45 78  nList(IList<DbEx
2800: 70 72 65 73 73 69 6f 6e 3e 20 6c 69 73 74 29 0d  pression> list).
2810: 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65  .    {..      re
2820: 74 75 72 6e 20 56 69 73 69 74 4c 69 73 74 3c 44  turn VisitList<D
2830: 62 45 78 70 72 65 73 73 69 6f 6e 3e 28 6e 65 77  bExpression>(new
2840: 20 4c 69 73 74 45 6c 65 6d 65 6e 74 48 61 6e 64   ListElementHand
2850: 6c 65 72 3c 44 62 45 78 70 72 65 73 73 69 6f 6e  ler<DbExpression
2860: 3e 28 56 69 73 69 74 45 78 70 72 65 73 73 69 6f  >(VisitExpressio
2870: 6e 29 2c 20 6c 69 73 74 29 3b 0d 0a 20 20 20 20  n), list);..    
2880: 7d 0d 0a 0d 0a 20 20 20 20 70 72 69 76 61 74 65  }....    private
2890: 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 56 69 73   static bool Vis
28a0: 69 74 4c 69 73 74 3c 54 45 6c 65 6d 65 6e 74 54  itList<TElementT
28b0: 79 70 65 3e 28 4c 69 73 74 45 6c 65 6d 65 6e 74  ype>(ListElement
28c0: 48 61 6e 64 6c 65 72 3c 54 45 6c 65 6d 65 6e 74  Handler<TElement
28d0: 54 79 70 65 3e 20 68 61 6e 64 6c 65 72 2c 20 49  Type> handler, I
28e0: 4c 69 73 74 3c 54 45 6c 65 6d 65 6e 74 54 79 70  List<TElementTyp
28f0: 65 3e 20 6c 69 73 74 29 0d 0a 20 20 20 20 7b 0d  e> list)..    {.
2900: 0a 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c 61 67  .      bool flag
2910: 20 3d 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20   = false;..     
2920: 20 66 6f 72 65 61 63 68 20 28 54 45 6c 65 6d 65   foreach (TEleme
2930: 6e 74 54 79 70 65 20 6c 6f 63 61 6c 20 69 6e 20  ntType local in 
2940: 6c 69 73 74 29 0d 0a 20 20 20 20 20 20 7b 0d 0a  list)..      {..
2950: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 66 6c 61          bool fla
2960: 67 32 20 3d 20 68 61 6e 64 6c 65 72 28 6c 6f 63  g2 = handler(loc
2970: 61 6c 29 3b 0d 0a 20 20 20 20 20 20 20 20 66 6c  al);..        fl
2980: 61 67 20 3d 20 66 6c 61 67 20 7c 7c 20 66 6c 61  ag = flag || fla
2990: 67 32 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20  g2;..      }..  
29a0: 20 20 20 20 72 65 74 75 72 6e 20 66 6c 61 67 3b      return flag;
29b0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 70  ..    }....    p
29c0: 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69 73 69  rivate bool Visi
29d0: 74 53 6f 72 74 43 6c 61 75 73 65 28 44 62 53 6f  tSortClause(DbSo
29e0: 72 74 43 6c 61 75 73 65 20 73 6f 72 74 43 6c 61  rtClause sortCla
29f0: 75 73 65 29 0d 0a 20 20 20 20 7b 0d 0a 20 20 20  use)..    {..   
2a00: 20 20 20 72 65 74 75 72 6e 20 56 69 73 69 74 45     return VisitE
2a10: 78 70 72 65 73 73 69 6f 6e 28 73 6f 72 74 43 6c  xpression(sortCl
2a20: 61 75 73 65 2e 45 78 70 72 65 73 73 69 6f 6e 29  ause.Expression)
2a30: 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20  ;..    }....    
2a40: 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 56 69 73  private bool Vis
2a50: 69 74 53 6f 72 74 43 6c 61 75 73 65 4c 69 73 74  itSortClauseList
2a60: 28 49 4c 69 73 74 3c 44 62 53 6f 72 74 43 6c 61  (IList<DbSortCla
2a70: 75 73 65 3e 20 6c 69 73 74 29 0d 0a 20 20 20 20  use> list)..    
2a80: 7b 0d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  {..      return 
2a90: 56 69 73 69 74 4c 69 73 74 3c 44 62 53 6f 72 74  VisitList<DbSort
2aa0: 43 6c 61 75 73 65 3e 28 6e 65 77 20 4c 69 73 74  Clause>(new List
2ab0: 45 6c 65 6d 65 6e 74 48 61 6e 64 6c 65 72 3c 44  ElementHandler<D
2ac0: 62 53 6f 72 74 43 6c 61 75 73 65 3e 28 56 69 73  bSortClause>(Vis
2ad0: 69 74 53 6f 72 74 43 6c 61 75 73 65 29 2c 20 6c  itSortClause), l
2ae0: 69 73 74 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  ist);..    }....
2af0: 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
2b00: 20 56 69 73 69 74 55 6e 61 72 79 45 78 70 72 65   VisitUnaryExpre
2b10: 73 73 69 6f 6e 28 44 62 55 6e 61 72 79 45 78 70  ssion(DbUnaryExp
2b20: 72 65 73 73 69 6f 6e 20 65 78 70 72 29 0d 0a 20  ression expr).. 
2b30: 20 20 20 7b 0d 0a 20 20 20 20 20 20 72 65 74 75     {..      retu
2b40: 72 6e 20 56 69 73 69 74 45 78 70 72 65 73 73 69  rn VisitExpressi
2b50: 6f 6e 28 65 78 70 72 2e 41 72 67 75 6d 65 6e 74  on(expr.Argument
2b60: 29 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20  );..    }....   
2b70: 20 70 72 69 76 61 74 65 20 64 65 6c 65 67 61 74   private delegat
2b80: 65 20 62 6f 6f 6c 20 4c 69 73 74 45 6c 65 6d 65  e bool ListEleme
2b90: 6e 74 48 61 6e 64 6c 65 72 3c 54 45 6c 65 6d 65  ntHandler<TEleme
2ba0: 6e 74 54 79 70 65 3e 28 54 45 6c 65 6d 65 6e 74  ntType>(TElement
2bb0: 54 79 70 65 20 65 6c 65 6d 65 6e 74 29 3b 0d 0a  Type element);..
2bc0: 20 20 7d 0d 0a 7d 0d 0a                            }..}..