I have a stored procedure that I wrote in SSMS using joins, show below
select distinct z.size, z.SortID from [ProductAttributes] x join [Product] y on x.ProductID = y.ProductID join [ProductSort] z on x.Size = z.Size where x.ProductID = @productID order by z.SortID
When I execute it returns the values I want and orders them by sortID, which I later supply to a dropdown list in ASP.NET MVC.
I have since then wrote the stored procedure query using linq, shown below
var sizes = (from x in db.ProductAttributes join y in db.Products on x.ProductID equals y.ProductID join z in db.ProductSorts on x.Size equals z.Size where x.ProductID == productID orderby z.SortID select x.Size).Distinct();
The problem is using this linq statement, it is not putting the data in the correct order, I am trying to order the dropdown list by sizes M, L, XL, XXL, XXXL, but it is returning L, M, XL, XXL, XXXL, so I am assuming it is ordering the data alphabetically.
If you look at the regular SQL statement the beginning of the query has 2 items after the select clause, can I not do this same thing in linq.
Any help would be appreciated
Advertisement
Answer
I this case I would force the ordering after the query.
Here are a couple of ways to do it.
var allPossibleSizesInCorrectOrder = new [] { "XXXS", "XXS", "XS", "S", "M", "L", "XL", "XXL", "XXXL", }; var ordering = allPossibleSizesInCorrectOrder .Select((x, n) => new { x, n }) .ToDictionary(xn => xn.x, xn => xn.n); var sizes = ( from x in db.ProductAttributes join y in db.Products on x.ProductID equals y.ProductID join z in db.ProductSorts on x.Size equals z.Size where x.ProductID == productID select x.Size ) .Distinct() .ToArray() .OrderBy(x => ordering[x]) .ToArray();
This ignores sorting on the database and does an in memory sort based on the order of the allPossibleSizesInCorrectOrder
array.
You could also do it this way:
var sizes = ( from x in db.ProductAttributes join y in db.Products on x.ProductID equals y.ProductID join z in db.ProductSorts on x.Size equals z.Size where x.ProductID == productID select new { x.Size, z.SortID } ) .ToArray() .OrderBy(x => x.SortID) .GroupBy(x => x.Size) .SelectMany(x => x.Take(1)) .Select(x => x.Size) .ToArray();