2011-10-24 10 views
1

以下の簡単なシナリオがあります。私は私のedmxで定義されているCustomerクラスを持っています。 Orderクラスもあり、顧客はOrdersプロパティを使用して0つ以上のOrdersを持つことができます。EFカスタムセレクタ式

私はこのような私の顧客クラスのOrderCountプロパティを定義した:

public partial class Customer 
{ 
    public int OrderCount { get; set; } 
} 

私は簡単に適切にこのOrderCountの値をロードする選択クエリを、書きたいと思います。私は、Customerクラスでこれをやってみました:

public partial class Customer 
{ 
    public int OrderCount { get; set; } 

    public static Expression<Func<Customer, Customer>> DetailSelector = c => 
     { 
      c.OrderCount = c.Orders.Count; 
      return c; 
     }; 
} 

[選択クエリ:

var customersWithOrderCount = ctx.Customers.Select(Customer.DetailSelector); 

しかし、文の本体を持つラムダがに変換することはできませんことを、私はエラーを取得するこの方法は、表現。 は、それから私はこれを実行しようとしました:

public partial class Customer 
{ 
    public int OrderCount { get; set; } 

    public static Expression<Func<Customer, Customer>> DetailSelector = c => Customer.LoadDetail(c); 

    public static Customer LoadDetail(Customer customer) 
    { 
     customer.OrderCount = customer.Orders.Count; 

     return customer; 
    } 
} 

しかし、私は選択クエリを実行すると、私は次の例外を取得し、この方法:

LINQ to Entities does not recognize the method 'Customer LoadDetail(Customer)' method, and this method cannot be translated into a store expression. 

これを行う最も簡単な方法でしょうか?

更新:明確にするために、私は具体的にExpressionでこれを行う方法を探しています。だから、私はデータベースからOrdersをロードしたくない、私はちょうどOrderCountプロパティを入力したい。 ありがとう、

答えて

0

これは少しシンプルですが、エンティティの基本的な作業設計にとどまると思います。 IMHOが.Order.Countを使用する最良の方法です。あなたがそこからそれを引っ張っているなら、それをそこに置くのはなぜですか?

selectクエリを記述する場合は、Customers.Ordersの値を直接インクルードしてください。適切なSQLが生成されます。それ以外の場合は、顧客をロードした直後にこの値をCustomerRepositoryクラスに設定するように個人的に含めることになります。そして、あなたは常にあなたの顧客を1か所から得て、あなたはそのセットを知っています(もちろんリポジトリパターンの使用を暗示します)

+0

はい、私はWCFの分散シナリオでCustomerインスタンスを使用しています。 Ordersをクライアントに送り、それらの数だけを送ります(これは実際のアプリケーションでは、このような他の多くのプロパティがあります)。 –