2013-03-28 75 views
0

这可能是一个简单的问题,但我有以下代码:如何选择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 

,但我需要选择PV电视时为空,反之亦然我知道这非常简单,但它是一天结束,我现在不能想。也想增加我的LINQ知识,所以任何有趣的指南都会很棒。

编辑为了给更多的信息电视打破了datarecords的一个子类,所以我可以搜索这些字段的字符串lol。我只是想选择一个返回结果基本不为null。

+2

'pv当电视为空,反之亦然'你从'pv.MyProperty'选择'tv'。如何在'pv'为空时选择'tv'? –

回答

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

注意:这是一个破解(O_O)。但它会导致tv如果pv为null返回:

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之前。

相关问题