public void CreateForMultiTimestampLookup()
        {
            var expectedSelectedColumns1 =
                new[]
            {
                StoragePropertyDefinitionTestHelper.GetIDColumnDefinition(_tableDefinition1.ObjectIDProperty),
                StoragePropertyDefinitionTestHelper.GetClassIDColumnDefinition(_tableDefinition1.ObjectIDProperty),
                StoragePropertyDefinitionTestHelper.GetSingleColumn(_tableDefinition1.TimestampProperty)
            };
            var expectedComparedColumns1 = new ColumnValueTable(
                new[] { StoragePropertyDefinitionTestHelper.GetIDColumnDefinition(_tableDefinition1.ObjectIDProperty) },
                new[]
            {
                new ColumnValueTable.Row(new[] { _objectID1.Value }),
                new ColumnValueTable.Row(new[] { _objectID2.Value }),
            });

            _dbCommandBuilderFactoryStrictMock
            .Expect(
                mock => mock.CreateForSelect(
                    Arg.Is(_tableDefinition1),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns1),
                    Arg <ColumnValueTable> .Matches(t => ColumnValueTableTestHelper.AreEqual(expectedComparedColumns1, t)),
                    Arg <IEnumerable <OrderedColumn> > .List.Equal(new OrderedColumn[0])))
            .Return(_dbCommandBuilder1Stub);

            var expectedSelectedColumns2 =
                new[]
            {
                StoragePropertyDefinitionTestHelper.GetIDColumnDefinition(_tableDefinition2.ObjectIDProperty),
                StoragePropertyDefinitionTestHelper.GetClassIDColumnDefinition(_tableDefinition2.ObjectIDProperty),
                StoragePropertyDefinitionTestHelper.GetSingleColumn(_tableDefinition2.TimestampProperty)
            };
            var expectedComparedColumns2 =
                new[] { new ColumnValue(StoragePropertyDefinitionTestHelper.GetIDColumnDefinition(_tableDefinition2.ObjectIDProperty), _objectID3.Value) };

            _dbCommandBuilderFactoryStrictMock
            .Expect(
                mock => mock.CreateForSelect(
                    Arg.Is(_tableDefinition2),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns2),
                    Arg <IEnumerable <ColumnValue> > .List.Equal(expectedComparedColumns2),
                    Arg <IEnumerable <OrderedColumn> > .List.Equal(new OrderedColumn[0])))
            .Return(_dbCommandBuilder2Stub);
            _dbCommandBuilderFactoryStrictMock.Replay();

            _objectReaderFactoryStrictMock
            .Expect(
                mock => mock.CreateTimestampReader(
                    Arg.Is(_tableDefinition1),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns1)))
            .Return(_timestampReader1Stub);
            _objectReaderFactoryStrictMock
            .Expect(
                mock => mock.CreateTimestampReader(
                    Arg.Is(_tableDefinition2),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns2)))
            .Return(_timestampReader2Stub);
            _objectReaderFactoryStrictMock.Replay();

            var result = _factory.CreateForMultiTimestampLookup(new[] { _objectID1, _objectID2, _objectID3 });

            _objectReaderFactoryStrictMock.VerifyAllExpectations();
            _dbCommandBuilderFactoryStrictMock.VerifyAllExpectations();

            var innerCommand =
                CheckDelegateBasedCommandAndReturnInnerCommand <IEnumerable <Tuple <ObjectID, object> >, IEnumerable <ObjectLookupResult <object> > > (result);

            Assert.That(innerCommand, Is.TypeOf(typeof(MultiObjectLoadCommand <Tuple <ObjectID, object> >)));

            var commandBuildersAndReaders = ((MultiObjectLoadCommand <Tuple <ObjectID, object> >)innerCommand).DbCommandBuildersAndReaders;

            Assert.That(commandBuildersAndReaders.Length, Is.EqualTo(2));
            Assert.That(commandBuildersAndReaders[0].Item1, Is.SameAs(_dbCommandBuilder1Stub));
            Assert.That(commandBuildersAndReaders[0].Item2, Is.SameAs(_timestampReader1Stub));
            Assert.That(commandBuildersAndReaders[1].Item1, Is.SameAs(_dbCommandBuilder2Stub));
            Assert.That(commandBuildersAndReaders[1].Item2, Is.SameAs(_timestampReader2Stub));
        }
        public void CreateForSortedMultiIDLookup_TableDefinition_MultipleIDLookup_AndMultipleTables()
        {
            var expectedSelectedColumns1 = _tableDefinition1.GetAllColumns();
            var expectedComparedColumns1 = new ColumnValueTable(
                new[] { StoragePropertyDefinitionTestHelper.GetIDColumnDefinition(_tableDefinition1.ObjectIDProperty) },
                new[]
            {
                new ColumnValueTable.Row(new[] { _objectID1.Value }),
                new ColumnValueTable.Row(new[] { _objectID2.Value }),
            });

            _dbCommandBuilderFactoryStrictMock
            .Expect(
                stub => stub.CreateForSelect(
                    Arg.Is(_tableDefinition1),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns1),
                    Arg <ColumnValueTable> .Matches(t => ColumnValueTableTestHelper.AreEqual(expectedComparedColumns1, t)),
                    Arg <IEnumerable <OrderedColumn> > .List.Equal(new OrderedColumn[0])))
            .Return(_dbCommandBuilder1Stub);

            var expectedSelectedColumns2 = _tableDefinition2.GetAllColumns();
            var expectedComparedColumns2 =
                new[] { new ColumnValue(StoragePropertyDefinitionTestHelper.GetIDColumnDefinition(_tableDefinition2.ObjectIDProperty), _objectID3.Value) };

            _dbCommandBuilderFactoryStrictMock
            .Expect(
                stub => stub.CreateForSelect(
                    Arg.Is(_tableDefinition2),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(_tableDefinition2.GetAllColumns()),
                    Arg <IEnumerable <ColumnValue> > .List.Equal(expectedComparedColumns2),
                    Arg <IEnumerable <OrderedColumn> > .List.Equal(new OrderedColumn[0])))
            .Return(_dbCommandBuilder2Stub);

            _dbCommandBuilderFactoryStrictMock.Replay();

            _objectReaderFactoryStrictMock
            .Expect(
                mock => mock.CreateDataContainerReader(
                    Arg.Is((IRdbmsStorageEntityDefinition)_tableDefinition1),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns1)))
            .Return(_dataContainerReader1Stub);
            _objectReaderFactoryStrictMock
            .Expect(
                mock => mock.CreateDataContainerReader(
                    Arg.Is((IRdbmsStorageEntityDefinition)_tableDefinition2),
                    Arg <IEnumerable <ColumnDefinition> > .List.Equal(expectedSelectedColumns2)))
            .Return(_dataContainerReader2Stub);
            _objectReaderFactoryStrictMock.Replay();

            var result = _factory.CreateForSortedMultiIDLookup(new[] { _objectID1, _objectID2, _objectID3 });

            _objectReaderFactoryStrictMock.VerifyAllExpectations();
            _dbCommandBuilderFactoryStrictMock.VerifyAllExpectations();
            Assert.That(result, Is.TypeOf(typeof(MultiDataContainerAssociateWithIDsCommand)));
            Assert.That(((MultiDataContainerAssociateWithIDsCommand)result).Command, Is.TypeOf(typeof(MultiObjectLoadCommand <DataContainer>)));

            var dbCommandBuilderTuples =
                ((MultiObjectLoadCommand <DataContainer>)((MultiDataContainerAssociateWithIDsCommand)result).Command).DbCommandBuildersAndReaders;

            Assert.That(dbCommandBuilderTuples.Length, Is.EqualTo(2));

            // Convert to Dictionary because the order of tuples is not defined
            var dbCommandBuilderDictionary = dbCommandBuilderTuples.ToDictionary(tuple => tuple.Item1, tuple => tuple.Item2);

            Assert.That(dbCommandBuilderDictionary.ContainsKey(_dbCommandBuilder1Stub), Is.True);
            Assert.That(dbCommandBuilderDictionary[_dbCommandBuilder1Stub], Is.SameAs(_dataContainerReader1Stub));
            Assert.That(dbCommandBuilderDictionary.ContainsKey(_dbCommandBuilder2Stub), Is.True);
            Assert.That(dbCommandBuilderDictionary[_dbCommandBuilder2Stub], Is.SameAs(_dataContainerReader2Stub));
        }