LINQ条件选择NULL成员集合



我已经搜索了许多类似的问题,但找不到解决此问题的问题。我很有可能忽略一些明显的东西,但是请建议如何使用一次迭代来做到这一点。

var dataWithResults =
    from d in data
    where d.QCResults != null
    from q in d.QCResults
    select new QCAMaterial
    {
        Name = q == null ? nodata : q.ComponentName,
        Value = q == null ? nodata : q.Result
    };
var dataWithNullResults =
    from d in data
    where d.QCResults == null
    select new QCAMaterial
    {
        Name = nodata,
        Value = nodata
    };

您可以组合Enumerable.EmptyEnumerable.DefaultIfEmpty

var allData =
            from d in data
            from q in d.QCResults ?? Enumerable.Empty<QCResult>().DefaultIfEmpty()
            select new QCAMaterial
            {
                Name = q == null ? nodata : q.ComponentName,
                Value = q == null ? nodata : q.Result
            };

如果您要处理一个空列表(QCResults)与null列表相同,则可以修改查询:

var allData =
            from d in data
            from q in (d.QCResults ?? Enumerable.Empty<QCResult>()).DefaultIfEmpty()
            select new QCAMaterial
            {
                Name = q == null ? nodata : q.ComponentName,
                Value = q == null ? nodata : q.Result
            };

因为两个没有QCResults的类以及属性中没有特定数据的QCResults获得nodata值,您可以省略'Where''并将它们组合为:

    IEnumerable<QCResult> dummycol = new[] {new QCResult()}; //assuming QCResult is the class exposed by the QCResults property
    var res = from d in data                
            from q in d.QCResults ?? dummycol
            select new QCAMaterial
            {
                Name = q == null ? nodata: q.ComponentName, //side note: can also be written as q?.ComponentName ?? nodata
                Value = q == null ? nodata : q.Result
            };

如果qcresults为空,则使用单个条目使用虚拟集合。同样可以在内联创建虚拟收集,但这应该更有效。

您可以使用SelectMany:

    var result = data.SelectMany(d => 
                        {
                            return d.QCResults != null
                                ? d.QCResults.Select(q => new QCAMaterial { Name = q.ComponentName, Value = q.Result})
                                : new List<QCAMaterial>{new QCAMaterial { Name = "no data", Value = "no data" }};
                        });

最新更新