C# GetValue,如何在Linq语句中处理空值
将实体导出到excel时遇到问题 我有这个Linq:C# GetValue,如何在Linq语句中处理空值,c#,linq,C#,Linq,将实体导出到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].GetVal
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
}
如果
props[ii]
为空,则调用GetValue(Entity)
将导致NullReferenceException
您的handleNullProps
方法甚至未到达-在此之前会引发异常
将select更新为类似以下内容
var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)
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);
}
}
现在您的handleNullProps
方法变得不必要了
编辑
因为您正在尝试扩展方法,所以您可以使用它们来获取您的值
var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)
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);
}
}
让方法定义如下
var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)
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
放在这两个参数中,因为我不知道它们的类型是否正确-将正确的类型设置为这两个参数,应该可以正常工作
如果
props[ii]
为null,则调用GetValue(Entity)
将导致NullReferenceException
您的handleNullProps
方法甚至未到达-在此之前会引发异常
将select更新为类似以下内容
var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)
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);
}
}
现在您的handleNullProps
方法变得不必要了
编辑
因为您正在尝试扩展方法,所以您可以使用它们来获取您的值
var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)
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);
}
}
让方法定义如下
var values = Enumerable.Range(0, iCols).Select(ii => props[ii] != null ? props[ii].GetValue(Entity) : String.Empty)
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方法不清楚在您的情况下什么是空的
如果是实体
,则应在以下情况之前将其过滤掉:
foreach (var Entity in EntitySet.Where(e=>e != null))
如果是props[ii]
那么选择(ii=>props[ii]?。GetValue(实体)
应该这样做。之后,您可以像以前一样过滤掉它们。
您的代码可以变成:
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
}
更新:如果是道具[ii]
那么我建议您过滤它:
List<PropertyInfo> props = FieldsToExport(EntitySet.AsQueryable()).Where(p=>p!=null).ToList();
你的情况下什么是空的还不清楚 如果是
实体
,则应在以下情况之前将其过滤掉:
foreach (var Entity in EntitySet.Where(e=>e != null))
如果是props[ii]
那么选择(ii=>props[ii]?。GetValue(实体)
应该这样做。之后,您可以像以前一样过滤掉它们。
您的代码可以变成:
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
}
更新:如果是道具[ii]
那么我建议您过滤它:
List<PropertyInfo> props = FieldsToExport(EntitySet.AsQueryable()).Where(p=>p!=null).ToList();
您是否熟悉
trialum
您可以在您的var值之前为Entity
分配一个值,例如var tmpEntity=string.IsNullOrEmpty(Entity)?DBNull.value.ToString():Entity;
为什么不用如下内容替换select语句:.select(ii=>props[ii]==null?string.empty:props[ii].GetValue(Entity));是的,我很熟悉它,但如何将它应用到Linq?我的一些实体有数百个字段。您熟悉trialum
吗您可以在var值之前为Entity
分配一个值,比如var tmpEntity=string.IsNullOrEmpty(Entity)?DBNull.Value.ToString():Entity;
为什么不将select语句替换为这样的语句:.select(ii=>props[ii]==null?string.empty:props[ii].GetValue(Entity));是的,我很熟悉它,但如何将它应用到Linq中?我的一些实体有数百个字段。null位于props[ii],表示记录(实体)上的字段,我需要导出所有表,甚至空值。Tks为了您的帮助,空值必须导出到。我不能为记录1传递四列,为记录2传递五列,所有记录必须包含相同的列。我尝试ExtensionMethods,因为这是一种更清晰、更优雅的方法。但这似乎是一种错误的方法。空值位于props[ii],表示记录(实体)上的字段,我需要导出所有表,甚至空值。Tks为了您的帮助,空值必须导出到。我不能为记录1传递四列,为记录2传递五列,所有记录必须包含相同的列。我尝试ExtensionMethods,因为这是一种更清晰、更优雅的方法。但似乎这是一种错误的方法。Tks我尝试ExtensionMethods是因为这是一种更清晰、更优雅的方式。但这似乎是一种错误的方式(这没有错,但你甚至还没有达到你的扩展方法-。它在那之前抛出了一个异常。让我给你一个更新,它非常简单和棒极了,为什么我不考虑它?非常tks。你great@JuanPabloGomez如果这有助于你,请考虑把这个答案作为纠正我现在正在做测试…之后是苏重新设置为正确答案。Tks我正在尝试ExtensionMethods,因为这是一种更清晰、更优雅的方式。但似乎这是一种错误的方式:(这没有错,但你甚至还没有达到你的扩展方法-。它在那之前抛出了一个异常。让我给你一个更新,它非常简单和棒极了,为什么我不考虑它?非常tks。你great@JuanPabloGomez如果这有助于你,请考虑把这个答案作为纠正我现在正在做测试…之后是苏我设置为正确答案。