2016-06-27 11 views
0

次のコードは、現在、データベースに接続を3回開いて各オブジェクトを引き出します。EFコアの複数のテーブルからデータを取り出すシングルデータベース呼び出し

データベースが一度しかヒットしないため、私が探しているすべてのオブジェクトを取り戻すためのより良い方法がありますか?

var metadataResult = new MetadataViewModel 
      { 
       Milestones = goalsContext.Milestones.Select(m => new MilestoneViewModel 
       { 
        Id = m.Id, 
        Name = m.Name, 
        Year = m.Year, 
        Date = m.Date 
       }), 
       Aggregates = goalsContext.Aggregates.Select(a => new AggregateViewModel 
       { 
        Id = a.Id, 
        Name = a.Name 
       }), 
       Metrics = goalsContext.Metrics.Select(m => new MetricViewModel 
       { 
        Id = m.Id, 
        Name = m.Name, 
        Description = m.Description 
       }) 
      }; 
+0

短い回答:いいえ。 EF6では、EntityFramework.Extendedの将来のクエリを使用してこれを行うことができます。 –

+0

私はSQLデータベースのエキスパートではありませんが、私のAPIコールでデータベースへの多数の接続を行い、単一の複雑なviewmodelオブジェクトを水和することは非常に非効率的です。上記は複雑なものではなく単純な見解です。 – twilliams

答えて

2

ビューモデルはかなり類似した形状であれば、あなたは1つのクエリですべてを取得し、その後、適切なViewModelにインスタンスに行を変換するために連合を使用することができるはずです。次のようなもの -

var combinedResults = 
    context.Products.Select(p => new 
    { 
     Type = "Product", 
     ID = p.ProductID, 
     Name = p.ProductName, 
     SupplierName = p.Supplier.CompanyName 
    }) 
    .Union(
     context.Categories.Select(c => new 
     { 
      Type = "Category", 
      ID = c.CategoryID, 
      Name = c.CategoryName, 
      SupplierName = (string)null 
     }) 
    ) 
    .ToList(); 

var viewModel = new ViewModel 
{ 
    Products = combinedResults 
     .Where(x => x.Type == "Product") 
     .Select(x => new ProductViewModel 
     { 
      ID = x.ID, 
      Name = x.Name, 
      SupplierName = x.SupplierName 
     }), 
    Categories = combinedResults 
     .Where(x => x.Type == "Category") 
     .Select(x => new CategoryViewModel 
     { 
      ID = x.ID, 
      Name = x.Name 
     }) 
}; 
関連する問題