Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ,仅选择子项的第一个元素_C#_Linq_Linq To Sql - Fatal编程技术网

C# LINQ,仅选择子项的第一个元素

C# LINQ,仅选择子项的第一个元素,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,使用LINQ,如何选择并仅返回第一个关联的子项 我有: [table: Report] GeneratedDate PerformanceMetric 1 -----> N [table PerformanceMetric] Bios Timestamp ... X

使用LINQ,如何选择并仅返回第一个关联的子项

我有:

[table: Report]
    GeneratedDate
    PerformanceMetric  1 -----> N [table PerformanceMetric]
    Bios                              Timestamp
    ...                               X
                                      Y 
                                      ..... (there is a good dozen other fields)
目前,我有:

 Report = _ctx.Reports.SingleorDefault(rpt => rpt.bios == mySerial);
这将返回包含所有关联的PerformanceMetric的报告。我只希望返回第一次出现的PerformanceMetric

LINQ是否提供了这样做的内置方式


编辑:事实上,我正在寻找报告,但PerformanceMetric应该只包含第一个元素。(Report.PerformanceMetrics.Count你在找这样的东西吗

var reportMetric = (from r in _ctx.Reports select r.PerformanceMetric where r.Bios == mySerial).FirstOrDefault();

很难准确地说出基于XML的完整结构,但类似于:

var firstMetric = _ctx.Reports
    .Where(rpt => rpt.bios == mySerial)
    .Select(rpt => rpt.PerformanceMetrics) // assuming name here...
    .FirstOrDefault();
这将返回与mySerial匹配的报表的第一个性能指标,如果where子句未找到任何报表或不存在任何性能指标,则返回默认值(对于类为null)

更新:根据问题中的更新,您需要一些不同的内容。您需要报告,但只有一个性能指标。这涉及到修改原始报告(不确定所有成员),这可能有点麻烦,因为您不想在LINQ中操纵原始数据

所以你有两个选择:

  • 您可以创建报表的新实例,并复制所有属性和一个度量
  • 您可以将报表和属性一起创建匿名类型
  • 我可能更喜欢#2,因为返回修改过的报告可能会让人困惑。因此您可以:

    var firstMetric = _ctx.Reports
        .Where(rpt => rpt.bios == mySerial)
        .Select(new { Report = rpt, Metric = rpt.PerformanceMetrics.FirstOrDefault() })
        .FirstOrDefault();
    
    这将扫描报告中的bios==mySerial,创建一个新的匿名类型,其中报告成员==到原始报告,度量成员==报告列表中的第一个度量

    如果不存在度量值,但报表存在,则您将获得一个匿名类型,其中report=your report,Metric=null。如果不存在匹配条件的报表,则返回null

    如果您确实想要#1,您可以这样做:

    var firstMetric = _ctx.Reports
        .Where(rpt => rpt.bios == mySerial)
        .Select(new Report 
            { 
                PerformanceMetrics = rpt.PerformanceMetrics.Take(1),
                // copy all other Report fields here...
            })
        .FirstOrDefault();
    

    所以您一直都有正确的实现?或者您想要报告,但是
    性能测量
    应该只包含第一个元素吗?是的,带有report.PerformanceMetrics的报告只包含1或0个元素。数据库中可能有1000条与报告关联的性能测量记录……好的,让我来看看这条记录ht,你想要这份报告,但你想修改报告,使绩效指标只包含0/1元素?看看下面的内容,看看它是否更符合你的需要。正如他们在下面所写的,你应该单独拿出绩效指标。只是对否决票的一个建议,如果你打算否决,最好包括在内关于原因的评论,以便作者了解问题所在。