Unable to fetch data from Azure Cosmos DB

Viewed 279

I am having the below model class CallbackResponse.cs :

public class CallbackResponse
    {
        public Callback Data { get; set; }
    }

    public class Callback
    {
        public IEnumerable<ReviewInProgressActivityFeed> ActivitiesFeed { get; set; }
    }

    public class ReviewInProgressActivityFeed
    {
        public ReviewInProgressStatus ReviewerSession { get; set; }
    }
    
    public class ReviewInProgressStatus
    {

        public Guid ReviewActivityId { get; set; }


        public string ReviewerName { get; set; }


        public string ReviewComments { get; set; }


        public DateTime ActivityDateTime { get; set; }
    }

Sample Payload:

{
"data": 
{
"activitiesFeed": [
                      {
"reviewerSession": 
{
"reviewActivityId": "dd9937c3-7c01-4a4a-bc8d-05ef37b07ee5",
"ReviewerName": "Verification Team",
"reviewComments": "upload business verification document for further verification.",
"activityDateTime": "2021-03-31T18:34:26.5978962Z"
},
                       },
                       {
"reviewerSession": 
{
"reviewActivityId": "dd9937c3-7c01-4a4a-bc8d-05ef37b07ee5",
"ReviewerName": "Other Team",
"reviewComments": "other documents required for verification.",
"activityDateTime": "2021-03-31T19:34:26.5978962Z"
},
                       }
                   ]
}
}

I am trying to get the data from DB via the CallbackResponse model class. Please find the code for below.

public async Task<CallbackResponse> CallbackActivityFeedAsync(Guid Id)
        {
            CallbackResponse containerItems = new CallbackResponse();

            IQueryable<HumanReviewRequest> query = cosmosReviewRequestContainer.GetItemLinqQueryable<HumanReviewRequest>(true);

            query = query.Where(x => x.id == Id);

            FeedIterator<HumanReviewRequest> feedIterator = query.ToFeedIterator();
            while (feedIterator.HasMoreResults)
            {
                FeedResponse<HumanReviewRequest> r = await feedIterator.ReadNextAsync().ConfigureAwait(false);
                foreach (HumanReviewRequest requestModel in r)
                {
                    containerItems = new CallbackResponse
                    {
                        Data = new Callback
                        {                            
                            ActivitiesFeed = new List<ReviewInProgressActivityFeed>
                            {
                                new ReviewInProgressActivityFeed
                                {
                                    ReviewerSession = new ReviewInProgressStatus
                                    {      
                                        ReviewActivityId = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ReviewActivityId).LastOrDefault(),
                                        ActivityDateTime = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ActivityDateTime).LastOrDefault(),                                     
                                        ReviewComments = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ReviewerComments).LastOrDefault(),
                                        ReviewerName = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ReviewerName).LastOrDefault()
                                    }
                                }
                            }
                        }
                    };
                }
            }
            return containerItems;
        }

The Problem here is I could not able to fetch all the records present in activitiesFeed array in DB. Instead I could only able to fetch the last record in that array(I am using Azure Cosmos DB). Please help me in this.

HumanReviewRequest.cs (which is DB Class)for reference:

public class HumanReviewRequest
   {
       public Guid Id { get; set; }
       
       public IEnumerable<ReviewActivity> ReviewActivities { get; set; }
   
   public class ReviewActivity
   {
       public ReviewerSession ReviewerSession { get; set; }

       public string UserComments { get; set; }
   }

   public class ReviewerSession
   {
       public Guid ReviewActivityId { get; set; }
   
       public Guid ReviewerUserId { get; set; }

       public DateTime ActivityDateTime { get; set; }

       public string ReviewerComments { get; set; }
   }

1 Answers

This is because you are creating a new List<ReviewInProgressActivityFeed>, a new ReviewInProgressActivityFeed and reading only the last element in activitiesFeed for each iteration:

ReviewerSession = new ReviewInProgressStatus
                                    {      
                                        ReviewActivityId = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ReviewActivityId).LastOrDefault(),
                                        ActivityDateTime = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ActivityDateTime).LastOrDefault(),                                     
                                        ReviewComments = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ReviewerComments).LastOrDefault(),
                                        ReviewerName = requestModel.ReviewActivities.Select(x => x.ReviewerSession.ReviewerName).LastOrDefault()
                                    }

Try below code instead of the above code:

 public async Task<CallbackResponse> CallbackActivityFeedAsync(Guid Id)
        {
            CallbackResponse containerItems = new CallbackResponse();
            containerItems.Data = new Callback();
            containerItems.Data.ActivitiesFeed = new List<ReviewInProgressActivityFeed>();

            IQueryable<HumanReviewRequest> query = cosmosReviewRequestContainer.GetItemLinqQueryable<HumanReviewRequest>(true);

            query = query.Where(x => x.id == Id);

            FeedIterator<HumanReviewRequest> feedIterator = query.ToFeedIterator();
            while (feedIterator.HasMoreResults)
            {
                FeedResponse<HumanReviewRequest> r = await feedIterator.ReadNextAsync().ConfigureAwait(false);
                if (r != null || r.ReviewActivities != null)
                {
                    foreach (HumanReviewRequest requestModel in r.ReviewActivities)
                    {
                        containerItems.Data.ActivitiesFeed.Add(
                                    new ReviewInProgressActivityFeed
                                    {
                                        ReviewerSession = new ReviewInProgressStatus
                                        {
                                            ReviewActivityId = requestModel.ReviewerSession.ReviewActivityId,
                                            ActivityDateTime = requestModel.ReviewerSession.ActivityDateTime,
                                            ReviewComments = requestModel.ReviewerSession.ReviewerComments,
                                            ReviewerName = requestModel.ReviewerSession.ReviewerName
                                        }
                                    });
                    }
                }
            }
        };
    }
}
return containerItems;
        }
Related