0
|
1 using System;
|
|
2 using System.Collections.Generic;
|
|
3 using System.Text;
|
|
4
|
|
5 namespace BLToolkit.Data.Sql
|
|
6 {
|
|
7 using Reflection.Extension;
|
|
8
|
|
9 public class Join : IQueryElement, ICloneableElement
|
|
10 {
|
|
11 public Join()
|
|
12 {
|
|
13 }
|
|
14
|
|
15 public Join(string tableName, params JoinOn[] joinOns)
|
|
16 : this(tableName, null, joinOns)
|
|
17 {
|
|
18 }
|
|
19
|
|
20 public Join(string tableName, string alias, params JoinOn[] joinOns)
|
|
21 {
|
|
22 _tableName = tableName;
|
|
23 _alias = alias;
|
|
24 _joinOns.AddRange(joinOns);
|
|
25 }
|
|
26
|
|
27 public Join(string tableName, string alias, IEnumerable<JoinOn> joinOns)
|
|
28 {
|
|
29 _tableName = tableName;
|
|
30 _alias = alias;
|
|
31 _joinOns.AddRange(joinOns);
|
|
32 }
|
|
33
|
|
34 public Join(AttributeExtension ext)
|
|
35 {
|
|
36 _tableName = (string)ext["TableName"];
|
|
37 _alias = (string)ext["Alias"];
|
|
38
|
|
39 var col = ext.Attributes["On"];
|
|
40
|
|
41 foreach (AttributeExtension ae in col)
|
|
42 _joinOns.Add(new JoinOn(ae));
|
|
43 }
|
|
44
|
|
45 private string _tableName;
|
|
46 public string TableName { get { return _tableName; } set { _tableName = value; } }
|
|
47
|
|
48 private string _alias;
|
|
49 public string Alias { get { return _alias; } set { _alias = value; } }
|
|
50
|
|
51 readonly List<JoinOn> _joinOns = new List<JoinOn>();
|
|
52 public List<JoinOn> JoinOns
|
|
53 {
|
|
54 get { return _joinOns; }
|
|
55 }
|
|
56
|
|
57 public Join Clone()
|
|
58 {
|
|
59 var join = new Join(_tableName, _alias);
|
|
60
|
|
61 foreach (var on in JoinOns)
|
|
62 join.JoinOns.Add(new JoinOn(on.Field, on.OtherField, on.Expression));
|
|
63
|
|
64 return join;
|
|
65 }
|
|
66
|
|
67 #region IQueryElement Members
|
|
68
|
|
69 public QueryElementType ElementType { get { return QueryElementType.Join; } }
|
|
70
|
|
71 StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic)
|
|
72 {
|
|
73 return sb;
|
|
74 }
|
|
75
|
|
76 #endregion
|
|
77
|
|
78 #region ICloneableElement Members
|
|
79
|
|
80 public ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone)
|
|
81 {
|
|
82 if (!doClone(this))
|
|
83 return this;
|
|
84
|
|
85 ICloneableElement clone;
|
|
86
|
|
87 if (!objectTree.TryGetValue(this, out clone))
|
|
88 objectTree.Add(this, clone = new Join(
|
|
89 _tableName,
|
|
90 _alias,
|
|
91 _joinOns.ConvertAll(j => (JoinOn)j.Clone(objectTree, doClone))));
|
|
92
|
|
93 return clone;
|
|
94 }
|
|
95
|
|
96 #endregion
|
|
97 }
|
|
98 }
|