Трудно точно определить полную структуру, основанную на вашем XML, но что-то вроде:
var firstMetric = _ctx.Reports
.Where(rpt => rpt.bios == mySerial)
.Select(rpt => rpt.PerformanceMetrics) // assuming name here...
.FirstOrDefault();
Возвращает первую метрику производительности отчета, соответствующую mySerial, или значение по умолчанию (пустое для классов), если гдеВ предложении не найдены отчеты или отсутствуют показатели производительности.
Обновление: на основе обновления в вопросе, вы хотите что-то другое.Вам нужен отчет, но только с одной метрикой производительности.Это включает в себя изменение оригинального отчета (не уверенного во всех участниках), что может быть довольно проблематично, потому что вы не хотите манипулировать своими исходными данными в LINQ.
Таким образом, у вас есть два варианта:
- Вы можете создать новый экземпляр отчета и скопировать все свойства и только одну метрику.
- Вы можете создать анонимныйвведите вместе с отчетом и свойством.
Я бы предпочел # 2, поскольку возврат измененного отчета может привести к путанице.Таким образом, вы можете сделать:
var firstMetric = _ctx.Reports
.Where(rpt => rpt.bios == mySerial)
.Select(new { Report = rpt, Metric = rpt.PerformanceMetrics.FirstOrDefault() })
.FirstOrDefault();
Это отсканирует Отчеты на предмет, где bios == mySerial, создаст новый анонимный тип с элементом Report == для исходного отчета и элементом Metric ==первая метрика в списке отчетов.
Если метрик не существует, но отчет существует, вы получите анонимный тип с Report = your report и Metric = 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();