[英]How to include related tables in DbSet.Find()?
如果我想在EF7查詢中包括相關對象,那就好又容易:
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>>
指定的“包含”關系一起加載。
有什么建議怎么做?
與查找結合使用查找,可以顯式加載相關實體。 在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鏈接
EF6是不可能的,我認為EF Core不會改變這一點。 這是因為Find
方法的主要目的是從本地緩存中獲取已經加載的實體,如果不存在,則從數據庫中加載它。 因此,緊急加載( Include
)只能在后一種情況下使用,而在前一種情況下,則需要執行顯式加載。 在技術上可以將兩種方法組合在一起,但是很難。
我認為您應該將FirstOrDefault
(或SingleOrDefault
)路由與急切的加載結合使用。 您可以使用急切加載在存儲庫通用方法GetById中看到EF6的示例實現。 可以使用dbContext.Model.FindEntityType(typeof(T)).FindPrimaryKey().Properties
來針對EF Core進行調整,以查找PK屬性並構建謂詞。 另外,由於EF Core包含要復雜一些(需要Include
/ ThenInclude
鏈),所以您可能會發現此線程很有趣。 可以在Entity Framework Core中創建基於字符串的Include替代項嗎? 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.