2011-12-28 11 views
3

私はLinqクエリを持っていて、直ちに実行してからデータを操作したいと考えています。次のコードでは、最初の(1)Linqクエリは、2番目の(2)Linqクエリが実行されるときに実行されます。私は最初に(1)クエリを実行したい、それを行う方法?LinqからSQLにすぐにクエリを実行

// 1 
var statistic = DataAccess.Instance.Statistics 
        .Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId) 
        .Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day }); 


values = new int[interval]; 
labels = new string[interval]; 

for (var i = 0; i < labels.Length; i++) 
{ 
    // 2 
    var recordsCount = statistic.Count(p => p.Year == dayStep.Year && p.Month == dayStep.Month && p.Day == dayStep.Day); 
} 

答えて

8

私はあなたが.NETでデータ操作における重要な概念に

繰延と即時フェッチ

が欠落している強調する重要なポイントは、デフォルトでは、SQLにLINQからデータを取得するということだと思います データベースを要求したときにのみ、LINQ to SQLクエリを定義したり、 テーブルコレクションを作成したりしないでください。これは遅延フェッチと呼ばれます。

foreachループが開始されると、LINQ to SQLは、LINQ to SQLクエリから導出された というSQL SELECT文を作成して実行し、ADO.NET DataReaderオブジェクトを作成します。 foreachループの各繰り返しは、その行のデータをフェッチするために必要なGetXXXメソッドを実行します。 の最後の行がフェッチされ、foreachループによって処理された後、LINQ to SQLは データベース接続を閉じます。

遅延フェッチでは、アプリケーションが実際に使用するデータのみがデータベース から取得されます。ただし、SQL サーバーのリモートインスタンス上で実行されているデータベースにアクセスする場合、行単位でデータを取得しても、ネットワーク帯域幅を最大限に活用することはできません。この シナリオでは、単一のネットワーク要求内のすべてのデータをフェッチしてキャッシュすることができます。 LINQ to SQLクエリを即時に評価する必要があります。

var productsQuery = from p in products.ToList() 
select p; 
+0

私は何かを逃してはいけない:あなたはこのように、ToListメソッドまたはあなたがSQL クエリにLINQを定義するときに、リストや配列にデータをフェッチしてToArray 拡張メソッドを呼び出すことによってこれを行うことができます。私はLinqの仕組みを理解しているので、最初にデータを実行してから追加の操作を実行する方法を尋ねます:)とにかく詳細な説明に感謝します! – Tomas

+0

:-) ....ちょうど.ToList()またはToArray()を追加して、あなたは大丈夫です。 –

+0

@PankajUpadhyayこれは 'var productsQuery =(製品のpから) select p.ToList();'コードと同じですあなたの例では?そうでない場合、 'where'節をあなたの例に追加すると、' where'節に一致する結果しか取得されませんか? – Igor

3

あなたは.ToList(のような何かを行うことができます

var statistic = DataAccess.Instance.Statistics.Where(p => p.DateStamp >= fromDate && p.DateStamp <= DateTime.UtcNow && p.UserId == userId). 
       Select(p => new {p.DateStamp.Year, p.DateStamp.Month, p.DateStamp.Day }).ToList(); 
1

.ToList()声明に注意を払う)この1文を試してみてください)、それが実行することを強制する必要があります。

関連する問題