如何使用Linq订购馆藏物业?

时间:2014-02-19 23:35:51

标签: c# linq entity-framework asp.net-mvc-4 collections

期间是一个集合,其中包含每个期间的属性“ periodStart ”和“ periodEnd ”。 我需要按每个Period的最后一个'periodEnd'的值来排序网格。

我认为下面的代码可行,...

var result = from sched in schedles
    orderby sched.Periods.Last().periodEnd descending
    select new Grid
    {
     ID = sched.ID,
     Name = sched.Name
    };

但我收到了错误 - >

  

消息:LINQ to Entities无法识别方法'... Last [Period](System.Collections.Generic.IEnumerable`1 [... Period])'   方法,此方法无法转换为商店表达式。

我确信对于更高级的开发人员来说这是一个简单的问题,但我知道我缺少一些理解。 提前感谢任何能帮助我理解这个orderby声明的局限性的人。

2 个答案:

答案 0 :(得分:4)

有许多常见的LINQ方法not supported by LINQ to EntitiesLast()就是其中之一。如果您使用First(),则会获得

  

方法'First'只能用作最终查询操作。

所以你应该做

orderby sched.Periods.OrderByDescending(p => p.periodEnd)
             .FirstOrDefault().periodEnd

您必须通过某个属性订购Period来告诉EF“第一”是什么。您可以使用FirstOrDefault()而不用防止空引用异常,因为整个表达式都被转换为SQL。它不是作为内存LINQ执行的。

答案 1 :(得分:0)

如果我理解你的问题,我相信这会得到你想要的结果:

var result = schedles.OrderByDescending(x => x.periodEnd).Select(new Grid
                                                                 {
                                                                      ID = sched.ID,
                                                                      Name = sched.Name
                                                                 });