Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GetValue,如何在Linq语句中处理空值_C#_Linq - Fatal编程技术网

C# GetValue,如何在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

将实体导出到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
} 

如果
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如果这有助于你,请考虑把这个答案作为纠正我现在正在做测试…之后是苏我设置为正确答案。