Если я понимаю структуру вашей таблицы, то довольно просто выполнить запрос вниз, чтобы получить результаты, которые вас интересуют.
Я собрал простой набор классов для проверки результатов.
public static class db
{
public static List<Sample> Samples = new List<Sample>();
}
public class Sample
{
public string Name;
public List<Test> Tests = new List<Test>();
}
public class Test
{
public string Name;
public List<Result> Results = new List<Result>();
}
public class Result
{
public string Name;
public string Status;
}
И я создал этот набор тестовых данных:
Отсюда легко запросить данные, чтобы получить только доступные результаты:
var query =
from s in db.Samples
from t in s.Tests
from r in t.Results
where r.Status == "Available"
select new { Sample = s.Name, Test = t.Name, Result = r };
Что дает мне эти данные:
Но это не группирует данные по образцам и тестам должным образом.
Один из способов сделать это правильно - создать новые Sample
& Test
объекты, которые содержат только доступные результаты, например:
var query =
from s in db.Samples
from rt in (
from t in s.Tests
from r in t.Results
where r.Status == "Available"
group r by t into rts
select new Test()
{
Name = rts.Key.Name,
Results = rts.ToList()
})
group rt by s into srts
select new Sample()
{
Name = srts.Key.Name,
Tests = srts.ToList()
};
Это дает такой результат:
Тем не менее, может оказаться невозможным или нежелательным создание нового экземпляра объектов, которые выглядят как реальные объекты, но на самом деле не из базы данных. Может быть возможно случайно сохранить один из этих объектов обратно в базу данных и стереть правильные записи!
Итак, альтернатива, которая, на мой взгляд, является наилучшей, заключается в создании вложенной структуры, которая содержит неизмененные объекты базы данных и включает в себя все доступные тесты в должном порядке, сохраняя при этом вложенную структуру !!
Вот как:
var query =
from s in db.Samples
from rt in
(from t in s.Tests
from r in t.Results
where r.Status == "Available"
group r by t into rts
select new
{
Test = rts.Key,
AvailableResults = rts.ToArray()
})
group rt by s into srts
select new
{
Sample = srts.Key,
AvailableTests = srts.ToArray()
};
И это дает:
С этими результатами у вас все еще есть доступ к неизмененным объектам Sample
и Test
, но все они отфильтрованы по доступным результатам.
Дайте мне знать, если это поможет.