这可能是一个简单的问题,但我有以下代码:
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这些字段。我只是想选择一个返回结果基本上不为空的。
答案 0 :(得分:1)
如果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;
但是,您只能有一种返回类型,因此,如果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 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之前取消装箱。