private void RegisterAggregate(string name, SqlParameterInfo param1, SqlParameterInfo param2, SqlType returnType, Action <IterateContext> iterate, Func <InitializeContext, Task> initialize = null, Func <MergeContext, Task> merge = null) { var methodInfo = new SqlFunctionInfo(new ObjectName(name), returnType); if (param1 != null) { methodInfo.Parameters.Add(param1); } if (param2 != null) { methodInfo.Parameters.Add(param2); } var aggregate = new SqlAggregateFunctionDelegate(methodInfo, iterate); aggregate.Initialize(initialize); aggregate.Merge(merge); Register(aggregate); }
public async Task ExecuteWithReference() { var info = new SqlFunctionInfo(new ObjectName("count"), PrimitiveTypes.BigInt()); info.Parameters.Add(new SqlParameterInfo("a", PrimitiveTypes.VarChar())); var function = new SqlAggregateFunctionDelegate(info, accumulate => { SqlObject r; if (accumulate.IsFirst) { r = accumulate.Current; } else { var x = accumulate.Accumulation; var y = accumulate.Current; r = x.Add(y); } accumulate.SetResult(r); }); var result = await function.ExecuteAsync(context, SqlExpression.Reference(ObjectName.Parse("a"))); Assert.NotNull(result); Assert.NotNull(result.ReturnedValue); Assert.True(result.HasReturnedValue); Assert.IsType <SqlConstantExpression>(result.ReturnedValue); var value = ((SqlConstantExpression)result.ReturnedValue).Value; Assert.Equal(SqlObject.Integer(56), value); }