2016-04-12 18 views
0

最近、エンティティフレームワーク6で多くのプログラミングを行ってきましたが、熱心な読み込みに関する特定の動作に悩まされています。私は私が実際にEFで遅延読み込みを有効にすることができます理解厳密に型指定されたリポジトリの戻り値の型

var customers = _db.Customers.Where(c => c.IsActive); 
var customersWithOrders = _db.Customers.Include(c => c.Orders).Where(c => c.IsActive); 

customers.SelectMany(c => c.Orders).DoSomething(...); // NRE 
customers.SelectMany(c => c.Orders).DoSomething(...); // Works 

を、それは、私はそれが単に選択N + 1つの問題にこれを回すと同じようにやって避けたいのですが何か:

これを取ります。

署名が本質的であるにもかかわらず両方のクエリが実際には異なる種類のデータを返すというのは私にとって嫌いなのですIEnumerable<Customer> EFの上に自分のリポジトリを書く場合、このように:上記は実際には正常に動作しますように、リポジトリは型パラメータTを与えられた積極的なロードの正確な量を行って何か

public class CustomerRepo { 
    IEnumerable<T> GetCertainCustomers<T>(...); 
    IEnumerable<T> DifferentCustomerQuery<T>(...); 
    IEnumerable<T> YetAnotherQuery<T>(...); 
} 

public class Customer {...} 
public class CustomerWithOrders : Customer { public IEnumerable<Order> Orders { get; set;} } 
public class CustomerWithPaymentMethods : Customer { public IEnumerable<Order> Orders { get; set;} } 

これと

私の問題は、種類の数があるということですあなたが2-3以上の異なるeagを持っているならば、爆発するだろうあなたが複数の関係を熱心にロードしたいときに何が起こるかは言及していません。

上記のコードはすべて説明のためのものであり、実際のものではありません。

+0

私はあなたが解決しようとしている問題を理解していません。特殊な型を作成したくない場合は、作成しないでください。 [Table Per Hierarchy](https://msdn.microsoft.com/en-us/library/cc716683(v=vs.100).aspx)と[Table-Per-Type](https://msdn.microsoft) .com/en-us/library/cc716702(v = vs.100).aspx)は、特定の要件に応じてかなりよく機能し、よく知られている確立されたパターンです。あなたが解決しようとしている問題をもう少し詳しく説明できますか? –

+0

特に、「NRE」とは何ですか?異なるタイプのデータを返す2つのクエリと、そのタイプが異なる理由は何ですか? 「正確な積載量」は正確には何ですか?あなたのリポジトリクラス/メソッドが受け入れるタイプではなく、あなたが書いたEFクエリーによって、熱心なローディングが規制されていませんか? –

答えて

0

null参照例外、特にが心配な場合は、デフォルトで空のコレクションをOrdersに渡すことができます。例えば

.Include(c => c.Order)せずに顧客のロード

public class Customer 
{ 
    public virtual List<Order> Orders { get; set; } 
    public Customer() 
    { 
     Orders = new List<Order>(); 
    } 
} 

コレクションが空ではなく、ヌルとどまることを意味します。これは、あなたの例を示しています:

customers.SelectMany(c => c.Orders).DoSomething(...); 
customersWithOrders.SelectMany(c => c.Orders).DoSomething(...); 

両方とも動作します(最初のものは何もしません。コレクションは空です)。

いずれにしても、である必要があります。あなたの方法で注文がある顧客が必要な場合は、をチェックする必要があります。オブジェクト内のどの情報がヌルであるかどうかを単に記述するクラスを定義することは、悪い考えです。

関連する問題