2016-08-30 4 views
1

は、私は次のモデルがあります:Linqを使用して動的クエリ結果をEntitySetに結合しますか?

public class Order 
{ 
    public int Id {get; set;} 
    public int CustomerId {get; set;} 
    public virtual Category Category {get; set;} 
    //Many more properties... 
} 

public class OrderLine 
{ 
    public int Id {get; set;} 
    public int OrderId {get; set;} 
    public virtual Order Order {get; set;} 
    public virtual Product Product {get; set;} 
    //Other properties... 
} 

は、私は特定の顧客の注文を取得する必要があります。私は、このクラスにデータを投影できることを考えていたように私はCustomerOrderためのマッピングOrderOrderLineクラスのコンフィギュレーションが、どれを持って

public class CustomerOrder 
{ 
    public int CustomerId {get; set;} 
    public int OrderId {get; set;} 
    public string ProductName {get; set;} 
    public virtual ICollection<OrderLine> {get; set;} 
} 

:あまりにも多くの情報を取得しないようにするためには、私はクラスを作成しました。

私がすることができます:

  1. 利用EF含ん指定してデータを取得します。データが取得されたら、それをCustomerOrderクラスに投影することができます。しかし、これは、主要なテーブルとインクルードされたテーブルのすべての列を取得するよう強制されますか?

  2. カスタムSQLクエリを使用して、Orderテーブルから必要な詳細を取得することができます(ビューから直接入力することもできます)。 Linqを使用してこの結果セットをOrderLineと結合すると、完全な投影が得られます。ただし、ビューのマッピング設定が必要ですか?

あまりにも多くの列を回避し、SQLのSELECT文に参加するには、CustomerOrderにデータを投影する最良の方法は何ですか?

+0

OrderとOrderLineの間にナビゲーションプロパティがありますか? –

+0

@ YacoubMassadはい。 –

+0

EFクエリの投影は、正しく実行されるとすべての列のロードを避けます。参照してください:http://stackoverflow.com/questions/1531934/entity-framework-only-get-specific-columns –

答えて

0

あなたは次のようにすることができます。あなたのモデルにもいくつか変更を加えなければなりません。私はそれをしました。それも見てください。

public class Order 
    { 
     public int Id {get; set;} 
     public int CustomerId {get; set;} 
     public virtual Category Category {get; set;} 
     public virtual ICollection <OrderLine> OrderLines {get; set;} 

     //Many more properties... 
    } 

public class OrderLine 
{ 
    public int Id {get; set;} 
    public int OrderId {get; set;} 
    public virtual Order Order {get; set;} 
    public virtual Product Product {get; set;} 

    //Other properties... 
} 

public class CustomerOrder 
{ 
    public int CustomerId {get; set;} 
    public int OrderId {get; set;} 
    public string ProductName {get; set;} 
    public virtual ICollection<OrderLine> OrderLines {get; set;} 
} 

最終クエリ:

var orderList = (from order in _context.Orders 
       from orderLine in order.OrderLines) 
       select new CustomerOrder 
        { 
         CustomerId = order.CustomerId, 
         OrderId = orderLine.OrderId, 
         ProductName= orderLine.Product.ProductName, 
         OrderLines = order.OrderLines 
        }).AsNoTracking().ToList(); 

1: No.Only投影カラムはDBからフェッチされます。

はアプローチベスト:は、必ずカスタム投影を使用する(のようなCustomerOrderは)我々はあまりにビューにデータを送信するためにそれを使用することができますEF query.Youのパフォーマンスを考えるとベストです.That(それはようなものですDTO(データ転送オブジェクト))。

関連する問題