Mercurial > pub > bltoolkit
diff Source/Data/Sql/Join.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Data/Sql/Join.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BLToolkit.Data.Sql +{ + using Reflection.Extension; + + public class Join : IQueryElement, ICloneableElement + { + public Join() + { + } + + public Join(string tableName, params JoinOn[] joinOns) + : this(tableName, null, joinOns) + { + } + + public Join(string tableName, string alias, params JoinOn[] joinOns) + { + _tableName = tableName; + _alias = alias; + _joinOns.AddRange(joinOns); + } + + public Join(string tableName, string alias, IEnumerable<JoinOn> joinOns) + { + _tableName = tableName; + _alias = alias; + _joinOns.AddRange(joinOns); + } + + public Join(AttributeExtension ext) + { + _tableName = (string)ext["TableName"]; + _alias = (string)ext["Alias"]; + + var col = ext.Attributes["On"]; + + foreach (AttributeExtension ae in col) + _joinOns.Add(new JoinOn(ae)); + } + + private string _tableName; + public string TableName { get { return _tableName; } set { _tableName = value; } } + + private string _alias; + public string Alias { get { return _alias; } set { _alias = value; } } + + readonly List<JoinOn> _joinOns = new List<JoinOn>(); + public List<JoinOn> JoinOns + { + get { return _joinOns; } + } + + public Join Clone() + { + var join = new Join(_tableName, _alias); + + foreach (var on in JoinOns) + join.JoinOns.Add(new JoinOn(on.Field, on.OtherField, on.Expression)); + + return join; + } + + #region IQueryElement Members + + public QueryElementType ElementType { get { return QueryElementType.Join; } } + + StringBuilder IQueryElement.ToString(StringBuilder sb, Dictionary<IQueryElement,IQueryElement> dic) + { + return sb; + } + + #endregion + + #region ICloneableElement Members + + public ICloneableElement Clone(Dictionary<ICloneableElement,ICloneableElement> objectTree, Predicate<ICloneableElement> doClone) + { + if (!doClone(this)) + return this; + + ICloneableElement clone; + + if (!objectTree.TryGetValue(this, out clone)) + objectTree.Add(this, clone = new Join( + _tableName, + _alias, + _joinOns.ConvertAll(j => (JoinOn)j.Clone(objectTree, doClone)))); + + return clone; + } + + #endregion + } +}