2009-04-10 3 views
1

を作成します。以下は私が思いついたLinqの質問です。それは動作しますが、最初のサブ選択のための単一の問合せを生成し、次に2番目のサブ選択の各レコードの1つの追加の問合せを生成します。ああ、DBのラウンドトリップは私を殺している。LinqToSql、複数のサブクエリが、私はこのように見える2つのテーブルを持っている多くの往復

これをどのようにして1つの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 
} 
+0

@BrettRobiチャンスがあるときに私の答えをチェックすれば、あなたのシナリオでうまくいくはずです。 – eglasius

答えて

0

フレディは正しい軌道に乗っていたとはほとんどそれを持っていました。ソリューションは各サブクエリの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() 
} 

サブクエリで一致するレコードは1つだけです。フレディさんに助けてくれてありがとう!

1

(関係に基づいて)更新

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

ほぼ。両方のサブクエリでToList()を使用すると、依然としてメインクエリ結果のすべてのレコードのラウンドトリップが生成されました。代わりにFirst()を使用していました。私は1つだけのレコードが一致する必要があることを言及する必要があります。 – BrettRobi

+0

あなたは本当ですか?サンプルのようにリターンに匿名型を使用していますか?私はちょうどいくつかのテストをしましたが、実際には複数回の往復をすることはできません(ToListを使わなくても - それでprobは効果がないということに同意します)...多分あなたが割り当てたタイプのものですか? – eglasius

+0

私は実際に陰茎のタイプを使用していませんでした。私はちょうど私のサンプルを簡素化するためにその変更を加えました。あなたはそれを具体的なタイプとして投影して違いを生み出したと思いますか?私はそれがSQLに何か差を生むかもしれないと考えたことはありません。 – BrettRobi

関連する問題