views:

144

answers:

4

I have a LINQ query like this:

from i in _db.Items.OfType<Medium>()
from m in i.Modules
from p in m.Pages
where i != null && i.Type == 1 && i.Published == true && p.PageId == 2
select p

I use the query like this because I have strongly typed view (ASP.NET MVC).

I need to have items sorted by the i.Sort property. orderby i.Sort and i.OrderBy(it => it.Sort) doesn't work. How can I fix this?

+1  A: 

When sorting with Linq you usually give OrderBy a property, and eventually an IComparer, not a sorting function. For example:

class Person {
    public int Age {get; set;}
}

public static void Main() {
    var ps = new List<Person>();
    ps.Add(new Person{Age = 1});
    ps.Add(new Person{Age = 5});
    ps.Add(new Person{Age = 3});

    var sorted = ps.OrderBy(p => p.Age);

    foreach(p in sorted) {
        Console.WriteLine(p.Age);
    }
}

Here Linq will know how to correctly sort integers.

Without giving more context (such as what exactly is i.Sort, what is its purpose, what do you want to do with it), it would be difficult to be more specific to your problem.

However, I'm pretty sure you are misunderstanding OrderBy: you should give it a lambda expression that identifies a property of the objects contained in your sequence, and then Linq will sort your sequence according to the usual order of the type of that property (or according to another order you define for that type, by using IComparer).

Bruno Reis
A: 

Let's say your Pages include page-numbers among their properties. Let's pretend this property is called "pagenumber". You would then add the following 'orderby' line between the 'where' and 'select' lines.

// (snip...)
where i != null && i.Type == 1 && i.Published == true && p.PageId == 2
orderby p.pagenumber
select p

Or maybe you don't have page numbers, but only page titles. You would do nearly the same thing:

where i != null && i.Type == 1 && i.Published == true && p.PageId == 2
orderby p.title
select p

Just from reading your code, I can't tell what criteria should be used for sorting. You need some kind of ordered element, an id number, a page number, or some text can be alphabetized.

daniel
A: 
from i in _db.Items.OfType<Medium>().OrderBy(x => x.Sort)
...
Robert Harvey