gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:48:43 25 4
gpt4 key购买 nike

使用 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 应该只包含第一个元素。 (报告.PerformanceMetrics.Count <= 1)抱歉不清楚..

最佳答案

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

var firstMetric = _ctx.Reports
.Where(rpt => rpt.bios == mySerial)
.Select(rpt => rpt.PerformanceMetrics) // assuming name here...
.FirstOrDefault();

这将返回与 mySerial 匹配的报告的第一个性能指标,如果 where 子句未找到任何报告或不存在性能指标,则返回默认值(类为空)。

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

所以你有两个选择:

  1. 您可以创建一个新的 Report 实例并复制所有属性和一个指标。
  2. 您可以将报表和属性一起创建一个匿名类型。

我可能更喜欢#2,因为返回修改后的报告可能会造成混淆。所以你可以这样做:

var firstMetric = _ctx.Reports
.Where(rpt => rpt.bios == mySerial)
.Select(new { Report = rpt, Metric = rpt.PerformanceMetrics.FirstOrDefault() })
.FirstOrDefault();

这将扫描报告以查找 bios == mySerial 的报告,创建一个新的匿名类型,其中报告成员 == 原始报告,以及指标成员 == 报告列表中的第一个指标。

如果不存在指标但存在报告,您将获得一个匿名类型,其中 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();

关于c# - LINQ,仅选择子项的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com