我在Entity Framework Core中有以下内容:
public class Book {
public Int32 Id { get; set; }
public String Title { get; set; }
public virtual Theme Theme { get; set; }
}
public class Theme {
public Int32 Id { get; set; }
public String Name { get; set; }
public Byte[] Illustration { get; set; }
public virtual ICollection<Ebook> Ebooks { get; set; }
}
我有以下linq查询:
List<BookModel> books = await context.Books.Select(x =>
new BookModel {
Id = x.Id,
Name = x.Name,
Theme = new ThemeModel {
Id = x.Theme.Id,
Name = x.Theme.Name
}
}).ToListAsync();
我不需要包含主题来完成这项工作,例如:
List<BookModel> books = await context.Books.Include(x => x.Theme).Select(x => ...
我什么时候需要在实体框架中使用Include?
UPDATE
我在主题中添加了一个Byte []插图类型的列。在我的预测中,我不包括该列,如果我使用Include,它会被加载吗?或者永远不会加载,除非我在投影中有它?
您不需要Include,因为您在EF上下文中工作。当您在正在创建的匿名对象中引用Theme时,不使用延迟加载,即告诉EF进行连接。
如果您返回书籍列表并且未包含主题,那么当您尝试获取主题时,您会注意到它是空的。如果EF连接已打开并且您有延迟加载,它将转到数据库并为您抓取它。但是,如果没有打开连接,那么你必须明确地得到它。
另一方面,如果您使用Include,则可以立即获得数据。在引擎盖下,它将连接到必要的表并在那里获取数据。
您可以检查EF为您生成的SQL查询,这样可以让您更清楚。您将只看到一个SQL查询。
如果Include
子项,则会将其作为原始查询的一部分加载,从而使其更大。
如果您不在查询中以其他方式Include
或引用子项,则初始结果集较小,但您稍后引用的每个子项将通过对数据库的新请求延迟加载。
如果您在一个请求中循环访问1000个用户,然后每个请求他们的10张照片,如果您不Include
孩子,您将发出1001个数据库请求...
此外,延迟加载需要上下文尚未处理。例如,当您将实体传递给UI渲染视图时,总是令人不快的惊喜。
更新以此为例,看看它是否失败:
var book = await context.Books.First();
var theme = book.Theme;
然后尝试这个:
var book = await context.Books.Include(b => b.Theme).First();
var theme = book.Theme;