Entity Framework 6 Recipes 2nd Edition(13-7)译 -> 返回只部分填充的实体
问题
你有一个实体里的某个属性很少被读取或和更新,这个属性因为比较大,所以读取和更新都需要付很大的代价.你想有选择的放置这个属性
解决方案
假设你有一个如Figure 13-9 所示的模型
Figure 13-9. A model with a Resume entity with a Body property that contains the entire text of the applicant’s resume
我们可以通过使用上下文的SqlQuery()方法来直接执行SQL语句,来避免加载实体的一个或多个属性.代码Listing 13-21 展示了这种方式
Listing 13-21. Returning Partially Filled Entities Using Both eSQL and ExecuteStoreQuery()
using (var context = new EFRecipesEntities())
{
var r1 = new Resume
{
Title = "C# Developer",
Name = "Sally Jones",
Body = "...very long resume goes here..."
};
context.Resumes.Add(r1);
context.SaveChanges();
}
using (var context = new EFRecipesEntities())
{
// using SqlQuery()
var result1 =
context.Resumes.SqlQuery
("select ResumeId, Title, Name,'' Body from chapter13.Resume",
"Resumes", MergeOption.AppendOnly).Single();
Console.WriteLine("Resume body: {0}", result1.Body);
var result2 =
context.Database.SqlQuery<Resume>("select * from chapter13.Resume", "Resumes",
MergeOption.OverwriteChanges).Single();
Console.WriteLine("Resume body: {0}", result2.Body);
}
它是如何工作的
获取部分填充的实体是一个方式是通过SqlQuery()方法,该方法是静态的Database对象暴露的,该对象可以从DbContext对象访问.此处我们执行SQL语句来获取除了Body之外的所有属性,Body属性我们只是用空的字符串初始化它.如需要加载,我们通过设置MergeOption值为MergeOption.OverwriteChanges并重新查询数据库.注意,我们的第二个查询将覆盖我们已经对内存中对象的所有修改.记住这种方式会SQL查询是字符串的,没有编译时查检和智能提示.
Recipe 13-8 (下一节)将演示以模型为中心更简洁的方式来解决这个问题.
kid1412声明:转载请把此段声明完整地置于文章页面明显处,并保留个人在博客园的链接:http://www.cnblogs.com/kid1412/(可点击跳转)。