【问题标题】:How to order a collection property using Linq?如何使用 Linq 订购集合属性?
【发布时间】:2014-02-19 23:35:50
【问题描述】:

Periods 是一个集合,其中包含每个 Period 的属性“periodStart”和“periodEnd”。 我需要按每个期间的最后一个“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 声明的局限性的人。

【问题讨论】:

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


    【解决方案1】:

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

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

    所以你应该这样做

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

    您必须通过某些属性订购Periods 以​​告诉 EF 什么是“第一”。您可以使用FirstOrDefault() 而无需防范空引用异常,因为整个表达式都被翻译成SQL。它不是作为内存中的 LINQ 执行的。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 2014-10-16
        • 1970-01-01
        • 2013-01-11
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多