2011-01-12 15 views
11

この単純なSQLクエリは、LINQから試してみると非常に困惑しています。LINQからSQLへのSELECT MIN(ZoneMin)、MAX(ZoneMin)FROM Plant`

ZoneMinのSQLテーブルPlantがあります。

この列の値の最小値と最大値を探したいとします。
T-SQLでの答えは非常に簡単です:

SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant

これに私を得ることができるLINQクエリ(またはいくつかの類似の)SQLは何ですか?

私は運がない.Aggregate()と.GroupBy()でさまざまな試みを行ってきました。私も同様のようないくつかの質問を見ました。

これは、結果の配列に適用されたメソッドで簡単に達成できますが、T-SQLでは非常に単純なときにすべてのSQL行から値を移送する必要はありません。

答えて

14

元のクエリと同じパフォーマンスを達成するには、同じクエリで同じレコードセットを2回参照できるように、グループ化(影響を最小限に抑える定数、たとえば0)を使用する必要があります。テーブル名を使用すると、各参照で新しいクエリが生成されます。次のことを試してみてください。これは、次のクエリ生成

(from plant in db.Plants 
group plant by 0 into plants 
select new { Min = plants.Min(p => p.ZoneMin), Max = plants.Max(p => p.ZoneMin) } 
).Single() 

SELECT MIN(plants.ZoneMin), MAX(plants.ZoneMin) 
FROM (SELECT 0 AS Grp, ZoneMin FROM Plants) AS plants 
GROUP BY plants.Grp 

そしてオプティマイザはそれで行われた後に、それは、少なくともSQL Server Management Studioのに応じて、クエリと同等のものを吐き出します。

+0

うまくやった! Allonありがとうございました。私は "グループで一定の"トリックを試してみることを忘れがちです。 – Peter

+2

@Peter:あなたは私より先です - あなたの質問を調べる前に、このトリックについて聞いたことさえありません。 –