繁体   English   中英

GetValue,如何将空值处理为Linq语句

[英]GetValue, How to handle null values into a Linq sentence

我在将实体导出到Excel时遇到问题。

我有这个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;
    }
}

如果props[ii]为null,则调用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启发的

目前尚不清楚您的情况是什么。

如果是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();

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

var values = props.Select(p=>p.GetValue(Entity)).Where(v => v !=  null);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM