Exemplo n.º 1
0
        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,
            });
        }
Exemplo n.º 2
0
        /// <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,
     };
 }