【问题标题】:Linq Max with null object and property具有空对象和属性的 Linq Max
【发布时间】:2015-10-01 17:54:54
【问题描述】:

我有航班对象列表。在此列表中,每个航班对象都有段对象列表。此段对象列表中的每个项目都有 FareDisplayInfos 对象列表。每个 FareDisplayInfos 对象都有诸如 totalFare 之类的属性

我想获得 Max totalFare。所以我这样编码。

Model.Flights.Max(a => a.FlightSegments.FirstOrDefault().FareDisplayInfos.Max(c => c.TotalFare));

但它给出了零,因为一些 totalFare 为空,而一些值为零。 如何消除空对象或零对象 注意:不仅 TotalFare 为零或为空。有时 FareDisplayInfos 等对象为空

编辑

在 tim-schmelter 的帮助下,我对此进行了编码,但将最大值设置为 0(零) 虽然这个(LeaveRouteListAcer)中有 43 个项目,并且这个项目有 FlightSegments,该段有很多 FareDisplayInfos 并且 FareDisplayInfos 有总票价(有些票价是 0 有些是 90....)

 var maxTotalFare = hModel.LeaveList
.SelectMany(f => f.FlightSegments
    .Where(fs => fs != null && fs.FareDisplayInfos != null)
    .Select(fs => fs.FareDisplayInfos.Max(fdi => fdi.TotalFare))
    .DefaultIfEmpty(0))
.Max();

【问题讨论】:

    标签: asp.net-mvc linq linq-to-sql linq-to-entities


    【解决方案1】:

    这应该可以工作,假设 TotalFare 可以为空:

    var maxTotalFare = Model.Flights
        .SelectMany(f => f.FlightSegments
            .Where(fs => fs != null && fs.FareDisplayInfos != null)
            .Select(fs => fs.FareDisplayInfos.Max(fdi => fdi.TotalFare ?? 0))
            .DefaultIfEmpty(0))
        .Max();
    

    【讨论】:

    • FareDisplayInfos 是对象数组。所以我们应该使用 FareDisplayInfos.Firsrt() 或其他任何东西
    • fdi.TotalFare ?? 0)) 在这里它给出错误运算符'??'不能应用于“十进制”和“整数”类型的操作数
    • @user1688401:然后尝试Max(fdi => fdi.TotalFare ?? 0m)TotalFare是什么类型的?
    • 它是十进制的。我改变了 0m 和其他东西它仍然给出错误错误运算符'??'不能应用于“十进制”和“十进制”类型的操作数
    • @user1688401:但你提到了“some totalFare is null”。如果它是decimal,它不能是null,而只是零。这就是为什么我认为它是decimal?。如果是 decimal,则不需要 null-coalescing-operator,只需:s.FareDisplayInfos.Max(fdi => fdi.TotalFare)
    【解决方案2】:

    用三元运算符这样检查就行了。

    Model.Flights.Max(a => a.FlightSegments == null 
    ? 0
    : a.FlightSegments.FirstOrDefault().FareDisplayInfos == null
       ? 0
       : a.FlightSegments.FirstOrDefault().FareDisplayInfos.Max(c => c.TotalFare == null ? 0 : c.TotalFare)
    );
    

    【讨论】:

    • 它仍然为零。我认为 FirstOrDefault 有问题
    • @user1688401 可能是 =) 理解你的数据库结构和你真正想做的事情真的很困难。但是当您需要检查 null 时,三元组将始终为您提供帮助。
    • 这不是我的数据库,这些数据来自(坏)服务有很多嵌套的对象,主父对象可以为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多