当另一个为null时,如何在LINQ中选择一个项目

时间:2013-03-28 17:08:45

标签: 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
                     where tv.name.Contains(lol)
                     || tv.length.Contains(lol)
                     || tv.startByte.Contains(lol)

                     select 

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

编辑为了提供更多信息,tv打破了datarecords的子类,这样我就可以搜索字符串lol这些字段。我只是想选择一个返回结果基本上不为空的。

2 个答案:

答案 0 :(得分:1)

如果pvtv碰巧属于同一类型,则可以执行此操作:

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;

但是,您只能有一种返回类型,因此,如果pvtv属于不同类型,则会出现问题。你可以这样做:

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) ...
}

答案 1 :(得分:0)

警告:这是 hack (o_O)。但如果tv为null,则会返回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 ((object)tv ?? (object)pv);

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