C# LINQ,仅选择子项的第一个元素
使用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
[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中操纵原始数据
所以你有两个选择:
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元素?看看下面的内容,看看它是否更符合你的需要。正如他们在下面所写的,你应该单独拿出绩效指标。只是对否决票的一个建议,如果你打算否决,最好包括在内关于原因的评论,以便作者了解问题所在。