2014-01-17 31 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); 

有什麼辦法來Include()Find()結合?

這裏是上下文。典型的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()方法沒有一個接受急切加載路徑列表的重載,但可能是因爲它首先查看已加載到上下文中的實體,從而嘗試高效。

你最好的賭注是第二個例子,但是你可以通過直接把狀態在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);