检查多子对象

时间:2016-07-14 08:57:12

标签: c# linq

我想测试null以避免异常。我收到了必须导出到excel并在Grid.Mvc

中显示的对象列表

Excel导出:

sheet.Cells["A" + i].Value = item.Car.Door.Code; //FLCo

网格显示:

columns.Add(c => c.Car.Door.Code).Titled("FLCo");

Car 可以为null,可以为null。

  

Q1:对于excel导出,我的解决方案是使用几个if/else(任何   更好的方式)?

     

对于网格显示:if/else或“?”不支持运算符   在linq里面

以下将生成错误

columns.Add(c => c.Car==null?"":(c.Car.Door==null?"":c.Car.Code)).Titled("FLCo");

错误:

  

无法将lambda表达式转换为type   'GridMvc.Columns.IGridColumn'因为它不是   代表

Q2:知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

如果您正在使用C#6(包含在VS2015中,感谢HimBromBeere。),您可以按照以下方式编写它:

sheet.Cells["A" + i].Value = item?.Car?.Door?.Code;

如果任何属性为NULL,则结果为NULL。

答案 1 :(得分:2)

至于 Q2 :您可以使用statement lambda将语句括在花括号中:https://msdn.microsoft.com/de-de/library/bb397687.aspx#Anchor_1

所以在你的情况下它会是

columns.Add(c => {c.Car==null?"":(c.Car.Door==null?"":c.Car.Code)}).Titled("FLCo");

答案 2 :(得分:1)

您可以使用"Elvis operator"。或者如果不支持,我更喜欢使用扩展方法。

public static class Maybe
{
    public static TResult With<TInput, TResult>
        (this TInput o, Func<TInput, TResult> evaluetor)
        where TInput : class
        where TResult : class
    {
        return o == null ? null : evaluetor(o);
    }

    public static TResult Return<TInput, TResult>
        (this TInput o, Func<TInput, TResult> evaluator, TResult failureValue)
        where TInput : class
    {
        return o == null ? failureValue : evaluator(o);
    }
}

所以在代码中你可以做类似

的事情
sheet.Cells["A" + i].Value = item.With(x => x.Car).With(x => x.Door).Return(x => x.Code, "null");