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# 当一个项目为空时,如何在LINQ中选择一个项目_C#_Linq - Fatal编程技术网

C# 当一个项目为空时,如何在LINQ中选择一个项目

C# 当一个项目为空时,如何在LINQ中选择一个项目,c#,linq,C#,Linq,这可能是一个简单的问题,但我有以下代码: string lol = "540"; var values = from pv in dataRecords.Values where pv.ID.Contains(lol) || pv.TotalLength.Contains(lol) from tv in pv.MyProperty

这可能是一个简单的问题,但我有以下代码:

string lol = "540";
        var values = from pv in dataRecords.Values
                     where pv.ID.Contains(lol)
                     || pv.TotalLength.Contains(lol)
                     from tv in pv.MyProperty
                     where tv.name.Contains(lol)
                     || tv.length.Contains(lol)
                     || tv.startByte.Contains(lol)

                     select 
但我需要在电视为空时选择pv,反之亦然。我知道这很简单,但这是一天的结束,我现在无法思考。我还想增加我的LINQ知识,这样任何有趣的指南都会很棒


编辑提供更多信息tv分解了数据记录的一个子类,因此我可以搜索字符串lol中的字段。我只是想选择一个返回结果基本上不为空的字段

如果
pv
tv
恰好是同一类型,您可以这样做:

var values = from pv in dataRecords.Values
             where pv.ID.Contains(lol)
             || pv.TotalLength.Contains(lol)
             from tv in pv.MyProperty
             where tv.name.Contains(lol)
             || tv.length.Contains(lol)
             || tv.startByte.Contains(lol)
             select tv ?? pv;
var values = from pv in dataRecords.Values
             where pv.ID.Contains(lol)
             || pv.TotalLength.Contains(lol)
             from tv in pv.MyProperty
             where tv.name.Contains(lol)
             || tv.length.Contains(lol)
             || tv.startByte.Contains(lol)
             select new { pv, tv };
foreach(var v in values)
{
    if (v.tv == null) ...
}
但是,您只能有一种返回类型,因此如果
pv
tv
是不同的类型,您将遇到问题。您可以这样做:

var values = from pv in dataRecords.Values
             where pv.ID.Contains(lol)
             || pv.TotalLength.Contains(lol)
             from tv in pv.MyProperty
             where tv.name.Contains(lol)
             || tv.length.Contains(lol)
             || tv.startByte.Contains(lol)
             select tv ?? pv;
var values = from pv in dataRecords.Values
             where pv.ID.Contains(lol)
             || pv.TotalLength.Contains(lol)
             from tv in pv.MyProperty
             where tv.name.Contains(lol)
             || tv.length.Contains(lol)
             || tv.startByte.Contains(lol)
             select new { pv, tv };
foreach(var v in values)
{
    if (v.tv == null) ...
}

注意:这是一个黑客攻击(o_o)。但如果
pv
为空,则返回
tv

var values = from pv in dataRecords.Values
         where pv.ID.Contains(lol)
         || pv.TotalLength.Contains(lol)
         from tv in pv.MyProperty
         where tv.name.Contains(lol)
         || tv.length.Contains(lol)
         || tv.startByte.Contains(lol)
         select ((object)tv ?? (object)pv);

请记住在使用
值之前取消装箱
IEnumerable。

pv当tv为空时,反之亦然
您可以从
pv.MyProperty
中选择
tv
。当
pv
为空时,如何选择
tv