private AggregateTuple <Type> MakeItem(SqlDataReader r, ItemOrdinal ordinal) { var aggregateType = Type.GetType(r.Field <string>(ordinal.AggregateType)); var aggregateID = r.Field <string>(ordinal.AggregateID); return(new AggregateTuple <Type> { AggregateID = (_makeAggregateID == null ? aggregateID : _makeAggregateID(aggregateID)), Item1 = aggregateType, }); }
/// <summary> /// Gets the aggregates to snapshot. /// </summary> /// <param name="aggregateTypes">The aggregate types.</param> /// <returns></returns> public IEnumerable <AggregateTuple <Type> > GetAggregatesToSnapshot(IEnumerable <Type> aggregateTypes) { var xml = new XElement("r", aggregateTypes .Select(x => { var eventType = x.GetType(); return(new XElement("a", new XAttribute("t", eventType.AssemblyQualifiedName))); })); using (var connection = new SqlConnection(_connectionString)) { var sql = string.Format(@" With _Type As ( Select _xml.item.value(N'@t', N'nvarchar(500)') As Type From @xml.nodes(N'/r/a') _xml(item) ), _Event As ( Select AggregateID, Max(EventSequence) + {0} As EventSequence From dbo.[{2}] Group By AggregateID ) Select AggregateID, AggregateType From dbo.[{1}] _Snapshot Where (Exists( Select Top 1 * From _Event Where (_Snapshot.AggregateID = _Event.AggregateID) And (_Snapshot.LastEventSequence >= _Event.EventSequence)));" , 10, _snapshotTableName, _eventTableName); var command = new SqlCommand(sql, connection) { CommandType = CommandType.Text }; command.Parameters.AddRange(new[] { new SqlParameter { ParameterName = "@xml", SqlDbType = SqlDbType.Xml, Value = xml.ToString() } }); connection.Open(); using (var r = command.ExecuteReader()) { var ordinal = new ItemOrdinal(r); while (r.Read()) { yield return(MakeItem(r, ordinal)); } } } }
/// <summary> /// Gets the aggregates to snapshot. /// </summary> /// <param name="aggregateTypes">The aggregate types.</param> /// <returns></returns> public IEnumerable<AggregateTuple<Type>> GetAggregatesToSnapshot(IEnumerable<Type> aggregateTypes) { var xml = new XElement("r", aggregateTypes .Select(x => { var eventType = x.GetType(); return new XElement("a", new XAttribute("t", eventType.AssemblyQualifiedName)); })); using (var connection = new SqlConnection(_connectionString)) { var sql = string.Format(@" With _Type As ( Select _xml.item.value(N'@t', N'nvarchar(500)') As Type From @xml.nodes(N'/r/a') _xml(item) ), _Event As ( Select AggregateID, Max(EventSequence) + {0} As EventSequence From dbo.[{2}] Group By AggregateID ) Select AggregateID, AggregateType From dbo.[{1}] _Snapshot Where (Exists( Select Top 1 * From _Event Where (_Snapshot.AggregateID = _Event.AggregateID) And (_Snapshot.LastEventSequence >= _Event.EventSequence)));", 10, _snapshotTableName, _eventTableName); var command = new SqlCommand(sql, connection) { CommandType = CommandType.Text }; command.Parameters.AddRange(new[] { new SqlParameter { ParameterName = "@xml", SqlDbType = SqlDbType.Xml, Value = xml.ToString() } }); connection.Open(); using (var r = command.ExecuteReader()) { var ordinal = new ItemOrdinal(r); while (r.Read()) yield return MakeItem(r, ordinal); } } }
private AggregateTuple<Type> MakeItem(SqlDataReader r, ItemOrdinal ordinal) { var aggregateType = Type.GetType(r.Field<string>(ordinal.AggregateType)); var aggregateID = r.Field<string>(ordinal.AggregateID); return new AggregateTuple<Type> { AggregateID = (_makeAggregateID == null ? aggregateID : _makeAggregateID(aggregateID)), Item1 = aggregateType, }; }