我有这样的LINQ查询:
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
我使用这样的查询,因为我有强类型视图(ASP.NET MVC)。
我需要按i.Sort
属性排序项目。 orderby i.Sort
和i.OrderBy(it => it.Sort)
不起作用。我该如何解决这个问题?
答案 0 :(得分:2)
使用Linq进行排序时,通常会给OrderBy
一个属性,最后给IComparer
,而不是排序函数。例如:
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);
}
}
Linq将知道如何正确排序整数。
如果没有提供更多上下文(例如究竟是i.Sort
的内容,它的目的是什么,你想用它做什么),那么你的问题将更加具体化。
但是,我很确定你误解了OrderBy
:你应该给它一个lambda表达式来识别你序列中包含的对象的属性,然后Linq会排序您的序列根据该属性类型的通常顺序(或根据您为该类型定义的另一个顺序,使用IComparer)。
答案 1 :(得分:0)
假设您的页面在其属性中包含页码。让我们假装这个属性叫做“pagenumber”。然后,您将在“where”和“select”行之间添加以下“orderby”行。
// (snip...)
where i != null && i.Type == 1 && i.Published == true && p.PageId == 2
orderby p.pagenumber
select p
或者您可能没有页码,只有页面标题。你会做同样的事情:
where i != null && i.Type == 1 && i.Published == true && p.PageId == 2
orderby p.title
select p
仅仅是阅读你的代码,我不知道应该使用什么标准进行排序。您需要某种有序元素,ID号,页码或某些文本可以按字母顺序排列。
答案 2 :(得分:0)
from i in _db.Items.OfType<Medium>().OrderBy(x => x.Sort)
...