2016-09-11 82 views
0

如果我想包括在EF7查詢相關的對象,這是不錯的,易於:如何在DbSet.Find()中包含相關表?

var myThing = db.MyThings 
       .Include(t => t.RelatedThing) 
       .Where(t => t.SomeCondition == true) 
       .ToList(); 

此外,還有對DbSet<T>一個很好的方法,可以很容易被它的鍵加載一個對象:

var myThing = db.MyThings.Find(thingId); 

但現在我想通過它的Id加載myThing以及它的RelatedThing。不幸的是(並且可以理解).Find()DbSet<T>的方法,而不是IQueryable<T>。很顯然,我可以這樣做:

var myThing = db.MyThings 
       .Include(t => t.RelatedThing) 
       .SingleOrDefault(t => t.MyThingId == thingId); 

但是我特別想用.Find()方法,因爲它是很好的和通用的,我正在寫一般加載記錄​​有沿方法「包含」由Expression<Func<T, object>>指定的關係。

任何建議如何做到這一點?

+1

請原諒我這個愚蠢的問題,但我找不到EF Core中的Find方法,它在哪裏? –

+1

@IvanStoev它是'Microsoft.EntityFrameworkCore'命名空間中'DbSet '類的一種方法。確保你正在使用最新的預發佈版本。 –

+0

我與RTM :) –

回答

2

這是不可能的EF6,我不認爲EF核心將改變這種狀況。這是因爲Find方法的主要用途是將已加載的實體從本地緩存中取出,或者如果不存在,則從數據庫加載它。所以急切的加載(Include)只能在後面的情況下使用,而在前者需要執行顯式加載。將這兩種方法結合起來可能在技術上是可行的,但是很難。

我想你應該把FirstOrDefault(或SingleOrDefault)路線與急切的加載結合起來。您可以在Repository generic method GetById using eager loading中看到針對EF6的示例實施。可以使用dbContext.Model.FindEntityType(typeof(T)).FindPrimaryKey().Properties來調整EF Core,以找到PK屬性並構建謂詞。另外,由於EF Core包含的內容稍微複雜一些(需要連接Include/ThenInclude鏈接),您可能會感興趣此主題Can a String based Include alternative be created in Entity Framework Core?

3

使用查找與負載相結合來顯式加載相關實體。 下面一個MSDN例子:

using (var context = new BloggingContext()) 
{ 
    var post = context.Posts.Find(2); 

    // Load the blog related to a given post 
    context.Entry(post).Reference(p => p.Blog).Load(); 

    // Load the blog related to a given post using a string 
    context.Entry(post).Reference("Blog").Load(); 

    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 

    // Load the posts related to a given blog 
    // using a string to specify the relationship 
    context.Entry(blog).Collection("Posts").Load(); 
} 

這裏是MSDN link