Вы не можете напрямую выполнить сводный запрос в LINQ.Вместо этого вы можете создать такую структуру:
var record = new
{
TimeStart = "10:00",
TimeStop = "11:00",
Sessions = new [] { "-", "Acco103", },
};
Когда у вас есть список этих записей, вы должны убедиться, что свойство Sessions
является массивом такой же длины, что и различное числосеансы во всем вашем наборе данных.Затем вы можете получить доступ к информации о сеансе путем индексации в массиве.
Это должно иметь больше смысла после просмотра запросов.
Сначала запросите в базе данных необходимые данные:
var query =
from s in db.TimeTables
orderby s.TimeStop
orderby s.TimeStart
group s by new { s.TimeStart, s.TimeStop } into gss
select new
{
gss.Key.TimeStart,
gss.Key.TimeStop,
Sessions = gss.ToArray(),
};
Теперь определите отдельный набор сеансов:
var sessionNums =
db.TimeTables
.Select(s => s.SessionNum)
.Distinct()
.OrderBy(n => n)
.ToArray();
Теперь обработайте эти данные в памяти (обратите внимание на вызов .ToArray()
на query
):
var process =
from q in query.ToArray()
let lookup = q.Sessions
.ToLookup(s => s.SessionNum, s => s.Details)
select new
{
q.TimeStart,
q.TimeStop,
Sessions = sessionNums
.Select(n => String.Join(
", ",
lookup[n].DefaultIfEmpty("-")))
.ToArray(),
};
Это где тяжелая работа.lookup
создает простой способ получить детализацию сеанса для любого SessionNum
.Вызов lookup[n].DefaultIfEmpty("-")
гарантирует наличие хотя бы одного значения для каждого сеанса.String.Join
гарантирует, что если в исходных данных было два сеанса для одного и того же номера сеанса в одно и то же время, мы получаем одно значение.
Этот результат является безопасным независимо от того, сколько будет сеансов, как это будетпросто расширяйте массивы.
Вывод запроса process
выглядит следующим образом:
Тогда вы можете выполнить этот запрос:
var result =
from p in process
select new
{
p.TimeStart,
p.TimeStop,
Session1 = p.Sessions[0],
Session2 = p.Sessions[1],
};
Это будет эффективно «сводить» ваши результаты, но вам нужно явно указать каждое свойство «SessionX».
Вывод запроса result
выглядит следующим образом: