我在将实体导出为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;
}
}
答案 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();