views:

2003

answers:

4

I have the following entity code, which returns all users and "includes" all of their sample requests:

    var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                           orderby u.LastName ascending
                           select u;

Each user has multiple SampleRequests. Each SampleRequest has an ID# (just an integer: 1, 22, 341, etc). The above LINQ to entities grabs the users and their SampleRequests like so:

User1: 33, 22, 341, 12

User2: 24, 3, 981

As you can see the SampleRequest ID# are not in an ascending order. I would like the results to be in order.

How do I put the orderby constraint on the Included SampleRequests ID#

Please note: SampleRequestId is a property of the SampleRequest...not a property of the User object

A: 

Just add another ordering parameter to the orderby:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                           orderby u.LastName ascending, 
                                   u.SampleRequestId descending
                           select u;
LBushkin
Thanks, but SampleRequestId is a property of the SampleRequests include, not of the User object.
@John: This is the only answer I see for what you described. I think we need more information first.
280Z28
OK i rewrote my question - i think it might be a bit more clear
A: 

Edit: Treed by <15 seconds.

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                orderby u.LastName ascending, u.SampleRequestId descending
                select u;
280Z28
Thanks, but SampleRequestId is a property of the SampleRequests include, not of the User object.
+3  A: 

I can currently think of two options for what you want. You can select them into a new class, where the user and the associated requests are properties:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                orderby u.LastName ascending
                select new
                {
                    User = u,
                    SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId)
                };

This will cause issues if you wanted to return this type, as it is anonymous.

You can also select this into a new user object, similar to this:

var userQuery = from u in _IntranetContext.UserSet.Include("SampleRequests")
                orderby u.LastName ascending
                select new User
                {
                    Property1 = u.Property1,
                    Property2 = u.Property2,
                    Property3 = u.Property3,
                    SampleRequests = u.SampleRequests.OrderByDescending(r => r.SampleRequestId).ToList()
                };

This will return a collection of User objects, but updating the objects in the database could cause issues.

Ryan Versaw
If User is an EF entity, you cannot assign the result of your OrderByDescending().ToList() call (a List<SampleRequest>) to the SampleRequests property on User, since its type will be EntityCollection<SampleRequest>. Also, I'd be wary of manually assigning each property in the query; if you add a new property to User later down the track and forget to update all your queries, you'll get User instances without that property assigned to. IMO it could be a maintenance PITA.
Daniel Chambers