using System; using System.Data.SqlTypes; using System.IO; using System.Text; using Microsoft.SqlServer.Server; using System.Collections.Generic; [Serializable] [SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToNulls = true, IsInvariantToDuplicates = false, IsInvariantToOrder = false, MaxByteSize = 8000, Name = "ConcatDistinct")] public class ConcatDistinct : IBinarySerialize { //private StringBuilder _intermediateResult; private IList _datos = new List(); internal string IntermediateResult { get { //return _intermediateResult.ToString(); return _datos.ToString(); } } public void Init() { //_intermediateResult = new StringBuilder(); _datos = new List(); } public void Accumulate(SqlString value) { if (value.IsNull) return; //_intermediateResult.Append(value.Value); if (!_datos.Contains(value.Value)) _datos.Add(value.Value); } public void Merge(ConcatDistinct other) { if (null == other) return; //_intermediateResult.Append(other._intermediateResult); foreach (String str in other._datos) { _datos.Add(str); } } public SqlString Terminate() { var output = string.Empty; /*if (_intermediateResult != null && _intermediateResult.Length > 0) output = _intermediateResult.ToString(0, _intermediateResult.Length - 1);*/ if (_datos != null && _datos.Count > 0) output = ListToStr(_datos); return new SqlString(output); } public void Read(BinaryReader reader) { if (reader == null) throw new ArgumentNullException("reader"); //_intermediateResult = new StringBuilder(reader.ReadString()); String dato = reader.ReadString(); if (dato == null) throw new Exception("dato está nulo"); if (_datos == null) throw new Exception("datos está nulo"); if (!_datos.Contains(dato)) _datos.Add(dato); } public void Write(BinaryWriter writer) { if (writer == null) throw new ArgumentNullException("writer"); writer.Write( ListToStr(_datos)); } private String ListToStr(IList list){ String aux = ""; foreach (String str in list) { aux += str; } return aux; } }