private void VerifyPartitionEntities(
            CloudTable table,
            IEnumerable <DynamicTableEntity> records,
            int partIdx,
            int expectedEntityCount,
            EqualityComparerDataProperty dataComparer,
            int expectedEntitiesWithDuplicateData,
            bool recordsContainInstanceInfo)
        {
            string recordDescription = recordsContainInstanceInfo ? "records with instance information" : "records without instance information";

            // Verify the entity count
            int numRecords = records.Count();

            if (numRecords != expectedEntityCount)
            {
                Utility.TraceSource.WriteError(
                    AzureTableUploaderTest.TraceType,
                    "Table {0} partition {1} does not have the expected number of {2}. Expected records: {3}, actual records: {4}.",
                    table.Name,
                    partIdx,
                    recordDescription,
                    expectedEntityCount,
                    numRecords);
                Verify.Fail("Unexpected count of records");
            }

            // Verify that the records do not have duplicate data
            IEnumerable <DynamicTableEntity> distinctRecords =
                records.Distinct(dataComparer);
            int numDistinctRecords = distinctRecords.Count();

            if ((numRecords - numDistinctRecords) != expectedEntitiesWithDuplicateData)
            {
                Utility.TraceSource.WriteError(
                    AzureTableUploaderTest.TraceType,
                    "We found duplicate data in {0} {1}, but we expected duplicate data in {2} records. Table {3}, partition {4}.",
                    (numRecords - numDistinctRecords),
                    recordDescription,
                    expectedEntitiesWithDuplicateData,
                    table.Name,
                    partIdx);
                Verify.Fail("Unexpected partition records with duplicate data");
            }

            // Verify that the data values are as expected
            int maxDataValue = records.Max(
                r => { return((int)r.Properties[AzureTableUploaderTest.DataProperty].Int32Value); });

            if (maxDataValue != (numDistinctRecords - 1))
            {
                Utility.TraceSource.WriteError(
                    AzureTableUploaderTest.TraceType,
                    "Unexpected maximum data value for {0} in table {1} partition {2}. Expected max: {3}, Actual max: {4}.",
                    recordDescription,
                    table.Name,
                    partIdx,
                    (numRecords - 1),
                    maxDataValue);
                Verify.Fail("Unexpected maximum entity data value in partition");
            }
            int minDataValue = records.Min(
                r => { return((int)r.Properties[AzureTableUploaderTest.DataProperty].Int32Value); });

            if (minDataValue != 0)
            {
                Utility.TraceSource.WriteError(
                    AzureTableUploaderTest.TraceType,
                    "Unexpected minimum data value for {0} in table {1} partition {2}. Expected min: {3}, Actual min: {4}.",
                    recordDescription,
                    table.Name,
                    partIdx,
                    0,
                    minDataValue);
                Verify.Fail("Unexpected maximum entity data value in partition");
            }
        }
        private void VerifyPartitionEntities(CloudTable table, int partIdx)
        {
            // Get records in the partition
            TableQuery <DynamicTableEntity> partitionQuery = new TableQuery <DynamicTableEntity>();

            partitionQuery = (new TableQuery <DynamicTableEntity>())
                             .Where(TableQuery.GenerateFilterCondition(
                                        "PartitionKey",
                                        QueryComparisons.Equal,
                                        partIdx.ToString()));
            IEnumerable <DynamicTableEntity> partitionRecords = table.ExecuteQuery(partitionQuery);

            if (0 == partitionRecords.Count())
            {
                Utility.TraceSource.WriteError(
                    AzureTableUploaderTest.TraceType,
                    "Table {0} partition {1} has no records.",
                    table.Name,
                    partIdx);
                Verify.Fail("No records found in partition");
            }

            bool hasDeletionEventWithIdOnly = (partitionRecords
                                               .Where(r => ((r.Properties.ContainsKey(AzureTableUploaderTest.EventTypeProperty)) &&
                                                            (r.Properties[AzureTableUploaderTest.EventTypeProperty].StringValue.Equals("IdOnlyDeletion"))))
                                               .Count()) > 0;
            int expectedEntityCount = EventsForPartition(partIdx);
            EqualityComparerDataProperty dataComparer = new EqualityComparerDataProperty();

            if (table.Name.Equals(String.Concat(AzureTableUploaderTest.TableNamePrefix, TableNames[1])))
            {
                // Get records without instance information
                IEnumerable <DynamicTableEntity> recordsWithoutInstance = partitionRecords.Where(
                    r => ((false == r.Properties.ContainsKey("dca_instance")) &&
                          (false == r.RowKey.Equals(AzureTableQueryableEventUploader.StatusEntityRowKey))));

                // Verify the records
                VerifyPartitionEntities(
                    table,
                    recordsWithoutInstance,
                    partIdx,
                    hasDeletionEventWithIdOnly ? (expectedEntityCount + 1) : expectedEntityCount,
                    dataComparer,
                    hasDeletionEventWithIdOnly ? 1 : 0,
                    false);
            }

            // Get records with instance information
            IEnumerable <DynamicTableEntity> recordsWithInstance = partitionRecords.Where(
                r => (r.Properties.ContainsKey("dca_instance")));

            // Verify the records
            VerifyPartitionEntities(
                table,
                recordsWithInstance,
                partIdx,
                hasDeletionEventWithIdOnly ? (expectedEntityCount - 1) : expectedEntityCount,
                dataComparer,
                0,
                true);

            // Verify the instance information in the records
            VerifyInstanceInformation(table, recordsWithInstance, partIdx, hasDeletionEventWithIdOnly);
        }