2016-09-19 14 views
0

私はデータベースとEFを初めて使用しています。私は、ASP.NET Core MVCプロジェクト内でEFを使用しています。以下の実装コードはコントローラからのもので、2つのテーブルのデータをサマリにまとめることを目的としています。DBの最初のEntity Frameworkクエリが非常に遅い

データベースには、Batch、Docというテーブルがあります。

バッチには、int BatchId、string BatchEndなどの多くの列があります。 BatchEndは一貫してフォーマットされたDateTimeです。 23/09/2016 14:33:21

Docには、文字列BatchId、文字列HardCopyDestinationが含まれます。多くのDocは同じBatchIdを参照することができますが、それを行うすべてのDocはHardCopyDestinationと同じ値を持ちます。私は、次のViewModel

public class Batch 
{ 
    public int BatchId { get; set; } 
    public string Time { get; set; } // from BatchEnd 
    public string HardCopyDestination { get; set; } 
} 

しかし、私の現在のクエリを移入したい

は、下記、犬が遅い実行されています。私はこれを正しく実装しましたか?

var BatchViewModels = new List<Batch>(); 

// this is fine 
var batches = _context.BatchTable.Where(
        b => b.BatchEnd.Contains( 
         DateTime.Now.Date.ToString("dd/MM/yyyy"))); 


// this bit disappears down a hole 
foreach (var batch in batches) 
{ 
    var doc = _context.DocTable.FirstOrDefault(
        d => d.BatchId == batch.BatchId.ToString()); 

    if (doc != null) 
    { 
     var newBatchVM = new Batch 
     { 
      BatchId = batch.BatchId, 
      Time = batch.BatchEnd.Substring(whatever to get time), 
      HardCopyDestination = doc.HardCopyDestination 
     }; 

     BatchViewModels.Add(newBatchVM); 
     continue; 
    } 
} 

return View(BatchViewModels); 
+2

なぜ文字列を使用してDateTimeインスタンスを表現していますか? Sql Serverでは、 'System.DateTime'を.net(c#)と' DateTime2(7) 'や' DateTime'で使うべきです。日付時間ですが、文字列ではありません)*。また、日付がどのようにフォーマットされているか(dd/mm/yyyyまたはmm/dd/yyyyなど)はプレゼンテーション層の解決策であり、決して持続層に持ち越されるべきではありません。 – Igor

+0

あなたの日付で奇妙なことをしています – KSib

+0

@Igorデータベースは私の影響範囲外に設計されています。私は自分自身のViewModelに影響を与えることができるので、それを完全に解析するだけでなく、時間要素として表示することができます。 –

答えて

0

私はバッチごとにデータベースを1回押すと思います。あなたは高価な多くのバッチがある場合。すべてのドキュメントをdbから一度に取得できます。ところで

var batchDict = batches.ToDictionary(b => b.BatchId); 
var documents = _context.DocTable.Where(doc => batchDict.Keys.Contains(doc.BatchId)); 
BatchViewModels.AddRange(documents.Select(d => new Batch 
{ 
    BatchId = d.BatchId, 
    Time = batchDict[d.BatchId].BatchEnd.TimeOfDay, // you only want the time? 
    HardCopyDestination = d.HardCopyDestination 
}); 

、イゴールは、日付についての権利であるとBatchIdがBatchTableにint型である場合に加えて、それは同様にDocTableでいるべきです。上記のコードでは、それらは同じ型であると仮定していますが、そうでない場合は変更するのが難しいはずはありません。

イーゴルは、問題の原因を調べるのにも適しています。私はちょうどあなたのコードに基づいて推測しています。

関連する問題