skip to Main Content

I have a Database Schema like this.

Database schema

I am working on gettingDetailByPostID API which needs to return 1 Object as follows.

    Guid PostId;
    Guid UserId;
    String? Username;
    String? MediaPath;
    int Likes; // count the number of likes of the post
    String? Caption;
    bool IsLiked;
    IEnumerable<Comment>? Comments; // List of comments in the post

I am having difficulty in joining the tables together to get more data from the User and Comment tables. How can I do this with ef core 6.

2

Answers


  1. firsr have a DbSet property for in your db context inherited class which may look like this public DbSet<Post> Posts { get; set; }.

    then inject the dbcontext to your required service as constructor injection.

    the you can do var post = yourDbContenxt.Posts.FirstOrDefaultAsync(p=>p.PostId==yourPostId);

    Login or Signup to reply.
  2. The best way to do this would be in a single transaction.
    I believe you already have configured EF with navigation and you should have an entities like this

        public class Post
        {
            public int post_id { get; set; }
            public int user_id { get; set; }
            public string caption { get; set; }
            public string? media_path { get; set; }
            virtual public List<Like> Likes { get; set; }
    
        }
        public class Like
        {
            public int post_id { get; set; }
            public int user_id { get; set; }
            virtual public Post Post { get; set; }
            virtual public UserProfile UserProfile { get; set; }
        }
        public class UserProfile
        {
            public int post_id { get; set; }
            public int user_id { get; set; }
            public string username { get; set; }
            virtual public Post Post { get; set; }
            virtual public List<Like> Likes { get; set; }
        }
    

    If not, you should have a look on the microsoft documentation or on this great tutorial site

    If it is configured with navigation (but without lazy loading to avoid infinite loop, and to have an ecological use of your server ressources 🙂 )

    Then you can build your object within the same context instanciation such as this short exemple

    
     public class DetailedPost
        {
            Guid PostId;
            Guid UserId;
            String? Username;
            String? MediaPath;
            int Likes; // count the number of likes of the post
            String? Caption;
            bool IsLiked;
            IEnumerable<Comment>? Comments; // List of comments in the post
            
            public DetailedPost GettingDetailByPostID(int id)
            {
                DbContext context = new DbContext();
    
                UserProfile userprofile = context.UserProfile
                    .Include(user => user.Posts.Where(p => p.post_id == id)) // Select post by id
                    .ThenInclude(post => post.Comments) // Include the Comment Db relative to post selected
                    .Include(user => user.Likes); // Include like db relative to userProfile db
    
    // Return object construction
                return new DetailedPost()
                {
                    PostId = userprofile.post_id,
                    UserId = userprofile.user_id,
                    Username = userprofile.username,
                    Caption = userprofile.Posts.FirstOrDefault().Caption,
                    Likes = userprofiles.Likes.Count(),
    
                };
    
            }
        }
    

    I hope it helps !

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search