GetValue,如何处理Linq句子中的空值

时间:2017-03-04 17:56:50

标签: c# linq

我在将实体导出为ex​​cel时遇到问题。

我有这个Linq:

List<PropertyInfo> props = FieldsToExport(EntitySet.AsQueryable());
int iCols = props.Count();

foreach (var Entity in EntitySet)
{
    var values = Enumerable.Range(0, iCols)
        .Select(ii => props[ii].GetValue(Entity)
                                .HandleNullProps()
        );

    // .... write in the sheet
} 

我的问题是当我的实体的[ii]属性具有空值时,即使HandleNullProps()正在过滤它,它也会抛出一个空异常。

这是我的HandleNullProps()

public static object HandleNullProps(this object s)
{
    if (s == null)
        return string.Empty;
    else
        return s;
    }
}

2 个答案:

答案 0 :(得分:3)

如果props[ii]为空,则调用GetValue(Entity)将导致NullReferenceException

甚至没有达到handleNullProps方法 - 在此之前抛出异常

将您的选择更新为此类

var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)

现在您的handleNullProps方法变得不必要了。

修改

由于您正在尝试扩展方法,因此无论如何都可以使用它们来获取您的值

var values = Enumerable.Range(0, iCols).Select(ii => props[ii].GetValueOrDefault(Entity))

让方法像这样定义

public static object GetValueOrDefault(this object s, object entity)
{
    if (s == null)
        return string.Empty;
    else
        return s.GetValue(entity);
    }
}

请记住,我将object放在两个参数上,因为我不知道它们的正确类型 - 为两个参数设置正确的类型并且应该正常工作

OrDefault部分的灵感来自其中一个linq方法FirstOrDefault

答案 1 :(得分:0)

不清楚你的情况是什么。

如果它是-DO33,那么您应该在之前将其过滤掉:

Entity

如果是foreach (var Entity in EntitySet.Where(e=>e != null)) 那么props[ii]就应该这样做 并且您可以像以前一样在病房之后过滤掉它们 您的代码可以变为:

.Select(ii => props[ii]?.GetValue(Entity)

更新:如果它是foreach (var Entity in EntitySet.Where(e => e != null)) { var values = Enumerable.Range(0, iCols) .Select(ii => props[ii]?.GetValue(Entity)).Where(v => v != null); // .... write in the sheet } ,那么我建议您过滤它:

props[ii]

无论如何整个代码变得更简单:

List<PropertyInfo> props = FieldsToExport(EntitySet.AsQueryable()).Where(p=>p!=null).ToList();