0

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

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 

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

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

4

2 回答 2

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;

但是,您只能有一种返回类型,因此如果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) ...
}
于 2013-03-28T17:12:08.223 回答
0

注意:这是一个hack ( o_O )。但是如果为null ,它将导致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 ((object)tv ?? (object)pv);

请记住在使用 IEnumerable 之前拆箱values

于 2013-03-28T17:25:16.790 回答