Linq-to-SQL "order by" child table values and return custom type

Simple set of 4 tables that link together: Projects -> Versions -> Marketshares -> Countries

Linq to SQL class has been set up to that each subsequent table as shown above is an entity set of the one before with ALL being one to many from parent to child except Marketshares -> Countries which is one to one.

If a list (of project) is returned then it's possible to iterate through the other tables on the linked values and all works well.

However, one particular query requires that I return only those projects where a particular element matches a filter setting on the marketshare table. This is fine and I can happily select the matching projects. Unfortunately I need to return a custom list and this means I need access to the values in marketshare and countries. But as these are one-to-many relationships, I cannot directly do something like:
p.project.version.marketshare.countries.countryname as I need the element index of some items such as p.project(0).versions(0).marketshare.countries.countryname but that is obviously not the right way to go about this...

So basically there is a value in marketshare called marketdestination and this links to an id in countries from which I pull the countryname. Assuming that I have the query correct (and the query below works for selection) then how do I specify that I want to sort the results by countryname from countries and return marketdestination and countryname in the query please?

thisList = (From p In pdc.tblProjects _
Where p.tblProjectVersions.Any(Function(t) t.tblProjectVersionMarketShares.Any(Function(tt) tt.marketDestination = lf.marketDestination))) _ And p.isDeleted = False _
Order By p.tblProjectVersions.FirstOrDefault.tblProjectVersionMarketShares.FirstOrDefault.tblCountries.CountryName Ascending _ 
Select New genListItem With {.listID = p.tblProjectVersions.FirstOrDefault.tblProjectVersionMarketShares.FirstOrDefault.marketDestination, .listValue = .tblProjectVersions.FirstOrDefault.tblProjectVersionMarketShares.FirstOrDefault.tblCountries.CountryName}).Distinct().ToList

Open in new window


I tried using "firstordefault" but it doesn't work...
LVL 1
carledAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

StephanLead Software EngineerCommented:
You are trying to use many-to-many relationships within linq-to-sql.... many-to-many is not supported, linq to entities has this possibility.

Try to devide your query using "var". I'm not really into the VB.NET so it is hard for me to read.

If you put your query till the orderby statement and put this in a separate var, then create the select from the var you created.

Take a look at this:
http://stackoverflow.com/questions/1097992/linq-to-entities-many-to-many-select-query
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
carledAuthor Commented:
Many thanks, helped greatly!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.