.net写sqlserver分组聚合函数

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text;
using System.Collections.Generic;
using System.Linq;

[Serializable]
[
    SqlUserDefinedAggregate(
    Format.UserDefined, //use custom serialization to serialize the intermediate result
    IsInvariantToNulls = true, //optimizer property
    IsInvariantToDuplicates = false, //optimizer property
    IsInvariantToOrder = false, //optimizer property    
    MaxByteSize = 8000) //maximum size in bytes of persisted value
]
public struct joinStr: IBinarySerialize
{
    private List<string> sbIntermediate;
    private string Spliter;

    /// <summary>
    /// 用户初始化
    /// </summary>
    /// <param name="spliter"></param>
    public void Init()
    {
        sbIntermediate = new List<string>();
    }

    /// <summary>
    /// 用来实现具体的聚合算法
    /// </summary>
    /// <param name="Value"></param>
    public void Accumulate(SqlString Value,string spliter=",")
    {
        if (Value == null || Value.ToString().ToLower().Equals("null"))
        {
            return;
        }
        else
        {
            if (!sbIntermediate.Contains(Value.ToString()))
            {
                sbIntermediate.Add(Value.ToString());
            }
        }
        this.Spliter = spliter;
    }

    /// <summary>
    /// 用来执行每一次的聚合逻辑顺序
    /// </summary>
    /// <param name="Group"></param>
    public void Merge (joinStr Group)
    {
        for (int i = 0; i < Group.sbIntermediate.Count; i++)
        {
            if (!sbIntermediate.Contains(Group.sbIntermediate[i])) {
                sbIntermediate.Add(Group.sbIntermediate[i]);
            }
        }
        
    }

    /// <summary>
    /// 用来将聚合的结果返回
    /// </summary>
    /// <returns></returns>
    public SqlString Terminate ()
    {
        //string[] aa=sbIntermediate.OrderBy(a => a).ToArray();
        string[] aa = sbIntermediate.ToArray();
        Array.Sort(aa);
        return new SqlString(string.Join(this.Spliter, aa));
    }

    // 这是占位符成员字段
    public int _var1;

    #region IBinarySerialize Members

    public void Read(System.IO.BinaryReader r)
    {
        sbIntermediate = new List<string> { r.ReadString() };
    }

    public void Write(System.IO.BinaryWriter w)
    {
        string[] aa = sbIntermediate.ToArray();
        Array.Sort(aa);
        w.Write(string.Join(this.Spliter, aa));
    }

    #endregion
}

猜你喜欢

转载自blog.csdn.net/hutao1101175783/article/details/78790587