LinqToSql - несколько подзапросов создают много циклических переходов - PullRequest
1 голос
/ 11 апреля 2009

У меня есть две таблицы, которые выглядят так:

альтернативный текст http://www.brettrobichaud.com/images/linq.png

Я пытаюсь сгенерировать запрос, который включает два конкретных StatisticsNames для каждого периода из ApplianceStatisticsLog. Ниже приведен запрос Linq. Это работает, но генерирует один запрос для первого суб-выбора, затем один дополнительный запрос для КАЖДОЙ записи для второго суб-выбора. Ой, кругосветные путешествия DB убивают меня.

Как я могу переработать это, чтобы выжать один SQL-запрос?

from l in ApplianceStatisticsLogs
where l.ApplianceServerId > 1
orderby l.PeriodEndUtc ascending
select new
{
Time = l.PeriodEndUtc,
Stat1 = from s in ApplianceStatistics
        where s.ApplianceStatisticsLogId == l.ApplianceStatisticsLogId
          &&  s.ApplianceStatisticNameId == 2
        select s.Value,
Stat2 = from s in ApplianceStatistics
        where s.ApplianceStatisticsLogId == l.ApplianceStatisticsLogId
          &&  s.ApplianceStatisticNameId == 3
        select s.Value
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2009

Обновление (на основе отношения) :

select new
{
Time = l.PeriodEndUtc,
Stat1 = (from s in l.ApplianceStatistics
         where s.ApplianceStatisticNameId == 2
         select s.Value
       ).ToList(),
Stat2 = (from s in l.ApplianceStatistics
         where s.ApplianceStatisticNameId == 3
         select s.Value
       ).ToList()
}

Попробуйте

select new
{
Time = l.PeriodEndUtc,
Stat1 = (from s in ApplianceStatistics
                where s.ApplianceStatisticsLogId == l.ApplianceStatisticsLogId
                  &&  s.ApplianceStatisticNameId == 2
                select s.Value
       ).ToList(),
Stat2 = (from s in ApplianceStatistics
                where s.ApplianceStatisticsLogId == l.ApplianceStatisticsLogId
                  &&  s.ApplianceStatisticNameId == 3
                select s.Value
       ).ToList()
}
0 голосов
/ 13 апреля 2009

Фредди был на правильном пути и почти имел это. Решением стало использование First () для каждого подзапроса. Как в:

from l in ApplianceStatisticsLogs
where l.ApplianceServerId > 1
orderby l.PeriodEndUtc ascending
select new
{
    Time = l.PeriodEndUtc,
    Stat1 = (from s in ApplianceStatistic
            where s.ApplianceStatisticsLogId == l.ApplianceStatisticsLogId
              &&  s.ApplianceStatisticNameId == 2
            select s.Value).First(),
    Stat2 = (from s in ApplianceStatistics
            where s.ApplianceStatisticsLogId == l.ApplianceStatisticsLogId
              &&  s.ApplianceStatisticNameId == 3
            select s.Value).First()
}

Я не упомянул, что в подзапросах должна совпадать только одна запись. Спасибо за помощь, Фредди!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...