如何为OrderBy Lambda表达式编写方法

时间:2018-07-12 12:56:28

标签: c# lambda

我有代码:

        var trips = _db.Trips
                        .OrderBy(u => u.TripStops.Where(p=>p.StopTypeId == destinationTypeId).OrderByDescending(c=>c.StopNo).Select(p=>p.Appt).FirstOrDefault())

这部分(按appt排序,最后一个TripStop类型= destinationTypeId)应在代码中的许多地方使用。

我想写一个像这样的方法:

private xxx LastTripStopAppt(...)
{
}

然后像这样使用它:

        var trips = _db.Trips
                        .OrderBy(LastTripStopAppt(u))

但是对于如何正确实现此方法有些困惑。

PS。我尝试这样做

    private DateTime? ReturnLastDeliveryAppointment(Trip u, int destinationTypeId)
    {
        return u.TripStops.Where(p => p.StopTypeId == destinationTypeId).OrderByDescending(c => c.StopNo).Select(p => p.Appt).FirstOrDefault();
    }

然后

.OrderBy(u => ReturnLastDeliveryAppointment(u, destinationTypeId))

但是我得到一个错误:

  

LINQ to Entities无法识别该方法   'System.Nullable`1 [System.DateTime]   ReturnLastDeliveryAppointment(Infrastructure.Asset.Trips.Trip,Int32)'   方法,并且该方法不能转换为商店表达式。

2 个答案:

答案 0 :(得分:3)

签名可能类似于:

private Expression<Func<Trip, apptType>> LastTripStopAppt(...)

其中appTypep.Appt的类型

您需要将destinationTypeId作为参数传递给此方法。

因此,如果appTypestring

private static Expression<Func<Trip, string>> LastTripStopAppt(int destinationTypeId)
{
    return u => u.TripStops.Where(p=>p.StopTypeId == destinationTypeId).OrderByDescending(c=>c.StopNo).Select(p=>p.Appt).FirstOrDefault();
}

答案 1 :(得分:-3)

选择* 从(VALUES(1),(4),(3))t(v) 按T排序;

Java 8:

Stream s = Stream.of(11,41,3);

s.sorted()  .forEach(System.out :: println);

输出:

3
 11
 41