markrendle / Simple.Data

A light-weight, dynamic data access component for C# 4.0
MIT License
1.33k stars 303 forks source link

Clean way to build object hierarchy from multiple tables #353

Open vincelee888 opened 9 years ago

vincelee888 commented 9 years ago

Given tables associated with foreign keys, i want to build a class structure that reflect the hierarchy. I've written the code below, but don't like all of those nested loops - is there a cleaner way to construct?

Cheers in advance!

var db = Database.OpenNamedConnection("Reviews");

            var result = db.tbl_OrderReviews
                .FindAllBySecurityAccessCode(securityAccessCode)
                .With(db.tbl_OrderReviews.tbl_OrderProductReviews)
                .With(db.tbl_OrderReviews.tbl_OrderProductReviews.tbl_Reviews)
                .With(db.tbl_OrderReviews.tbl_OrderProductReviews.tbl_Reviews.tbl_Reviewers)
                .Get(1);

            var products = new List<ReviewableOrderProduct>();

            // STINKY! - VL 081014
            foreach (var p in result.tbl_OrderProductReviews)
            {
                dynamic reviewRecord = null;
                dynamic reviewerRecord = null;
                try
                {
                    foreach (var review in result.tbl_Reviews)
                    {
                        if (review.OrderProductReviewId == p.OrderProductReviewID)
                        {
                            reviewRecord = review;
                            foreach (var reviewer in result.tbl_Reviewers)
                            {
                                if (review.ReviewerId == reviewer.ReviewerId)
                                {
                                    reviewerRecord = reviewer;
                                    break;
                                }
                            }
                            break;
                        }
                    }
                }
                catch (RuntimeBinderException e)
                {

                }

                if (reviewRecord != null && reviewerRecord != null)
                {
                    var reviewEntity = new ReviewableOrderProductReview(reviewerRecord.DisplayName,
                        reviewRecord.OverallRating);
                    products.Add(new ReviewableOrderProduct(p.OrderProductReviewID, p.ProductName, p.ApplianceTypeId,
                        reviewEntity));
                }
                else
                {
                    products.Add(new ReviewableOrderProduct(p.OrderProductReviewID, p.ProductName, p.ApplianceTypeId));
                }
            }

            var reviewableOrder = new ReviewableOrder(result.SecurityAccessCode, products);
jdscolam commented 9 years ago

I've been wondering about this as well...