I didn’t plan project correctly from beginning so I ended up having many SQL Queries scatterd around page.
So to avoid catching Sql exceptions in every other method or missing half of page due to exception in one of methods I want to pull all the data I need so :
This is method from dll file, I need to return it so I can work with objects after context dispose but I am doing something awfully wrong (first query finalproduct returns empty):
public static Tuple<Product, IEnumerable<Tag>, IEnumerable<ProductComment>, IEnumerable<ProductVote>, IEnumerable<Review>, IEnumerable<ReviewComment>, IEnumerable<ReviewVote>> GetBigProduct(int productID)
{
using (ProductClassesDataContext context = new ProductClassesDataContext())
{
var outproduct = from product in context.Products
where product.ID == productID
join producttag in context.ProductTags on product.ID equals producttag.productID
join tag in context.Tags on producttag.TagID equals tag.ID
join productComment in context.ProductComments on product.ID equals productComment.productID
join productVote in context.ProductVotes on product.ID equals productVote.productID
join review in context.Reviews on product.ID equals review.productID
join reviewComment in context.ReviewComments on review.ID equals reviewComment.reviewID
join reviewVote in context.ReviewVotes on review.ID equals reviewVote.reviewID
select new Tuple<Product, Tag, ProductComment, ProductVote, Review, ReviewComment, ReviewVote>
(product, tag, productComment, productVote, review, reviewComment, reviewVote);
var finalProduct = (from t in outproduct select t.Item1).Single();
var finalTags = (from t in outproduct select t.Item2).ToList();
var finalProductComments = (from t in outproduct select t.Item3).ToList();
var finalProductVotes = (from t in outproduct select t.Item4).ToList();
var finalReviews = (from t in outproduct select t.Item5).ToList();
var finalReviewsComments = (from t in outproduct select t.Item6).ToList();
var finalReviewsVotes = (from t in outproduct select t.Item7).ToList();
return new Tuple<Product, IEnumerable<Tag>, IEnumerable<ProductComment>, IEnumerable<ProductVote>, IEnumerable<Review>, IEnumerable<ReviewComment>, IEnumerable<ReviewVote>>
(finalProduct, finalTags, finalProductComments, finalProductVotes, finalReviews, finalReviewsComments, finalReviewsVotes);
}
}
Are you sure there is only one element returned by
from t in outproduct select t.Item1query?According to documentation,
Single():You may need
First()orFirstOrDefault()instead.Update after comments
I think the problem is with your joins. Actually, I don’t think you want to do joins here. What you need, I guess, is something like following:
Then you will get, out of
outproductquery, a collection of of tuples containing<Product, List of ProductComments, List of Tags>.You can easily add rest of your tuple dimensions. I removed them for simplicity.
You can now returns this tuple directly from your function doing just
There is no need for your
var finalProduct =-style lines and rebuilding the final tuple.