2014-01-17 11 views
7

これはうまくいきますが、最初のものには本当に興味がありません。EFで見つけて含める6

Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select (d => d.OrderLines)).FirstOrDefault(); 

これはうまくいきます。

string custKey = "VINET"; 

Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select(d => d.OrderLines)).Where(c => c.CustomerID.Equals(custKey, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); 

これは機能し、私が望むようにデータベースを読み取りますが、必要なインクルードはありません。

Customer foundCustomer = context.Set<Customer>().Find(custKey); 

これは動作しません....しかし、私は

Customer foundCustomer = context.Set<Customer>().Include(e => e.Orders.Select(d => d.OrderLines)).Find(custKey); 

後、実際だと、Find()Include()を結合する方法はありますか?

ここにコンテキストがあります。典型的なNorthwind顧客/注文/注文詳細シナリオ。

public partial class WindyContext : DbContext 
{ 
    static WindyContext() 
    { 
     //Database.SetInitializer<WindyContext>(null); 
    } 

    public WindyContext() 
     : base("Name=NorthwindContext") 
    { 
    } 

    public DbSet<Customer> Customers { get; set; } 
    public DbSet<OrderLine> DbSetOrderLines { get; set; } 
    public DbSet<Order> Orders { get; set; } 
    public DbSet<Product> Products { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new CustomerMap()); 
     modelBuilder.Configurations.Add(new OrderLineMap()); 
     modelBuilder.Configurations.Add(new OrderMap()); 
     modelBuilder.Configurations.Add(new ProductMap()); 
    } 
} 

答えて

7

いいえ、そのような運はありません。 Find()メソッドがeager-loadパスのリストを受け取るオーバーロードを持たない理由はわかりませんが、すでにコンテキストにロードされているエンティティを最初に調べることで効率的になります。

あなたが最善の策は、第2の例であるが、あなたはFirstOrDefault()コールで直接条件を入れて少しそれをクリーンアップすることができます

Customer foundCustomer = context.Set<Customer>() 
    .Include(e => e.Orders.Select(d => d.OrderLines)) 
    .FirstOrDefault(c => c.CustomerID.Equals(custKey, StringComparison.OrdinalIgnoreCase)); 

あなたはまた、あなたの場合==の代わりEquals()を使用することができるかもしれませんデータベース/列照合はすでに大文字小文字を区別しないように設定されています。

+4

データベース照合が常に比較をオーバーライドするので、 '='を使用することもできます。 –

3

「検索」を使用する際に「含む」を使用することはできません。他のエンティティを明示的に読み込みたい場合は、次のように試してみてください:

var customer = context.Customers.Include(x => x.Orders) 
           .Include("Orders.OrderLines") 
           .SingleOrDefault(x => x.CustomerID == custKey); 
関連する問題