本节,我们将介绍一些改善EF代码的相关方法,如NoTracking,GetObjectByKey, Include等。

l         MergeOption.NoTracking

当我们只需要读取某些数据而不需要删除、更新的时候,可以指定使用MergeOption.NoTracking的方式来执行只读查询(EF默认的方式是AppendOnly)。当指定使用NoTracking来进行只读查询时,与实体相关的引用实体不会被返回,它们会被自动设置为null。因此,使用NoTracking可以提升查询的性能。示例代码如下:

[Test]

public void NoTrackingTest()

{

using (var db = new NorthwindEntities1())

{

//针对Customers查询将使用MergeOption.NoTracking

db.Customers.MergeOption = MergeOption.NoTracking;

var cust = db.Customers.Where(c => c.City == "London");

foreach (var c in cust)

Console.WriteLine(c.CustomerID);

//也可以这样写

//var cust1 = ((ObjectQuery<Customers>)cust).Execute(MergeOption.NoTracking);

//Esql写法

//string esql = "select value c from customers as c where c.CustomerID='ALFKI'";

//db.CreateQuery<Customers>(esql).Execute(MergeOption.NoTracking).FirstOrDefault();

}

}

l         GetObjectByKey/First

GetObjectByKey:

在EF中,使用GetObjectByKey方法获取数据时,它首先会查询是否有缓存,如果有缓存则从缓存中返回需要的实体。如果没有则查询数据库,返回需要的实体,并添加在缓存中以便下次使用。

First: 总从数据库中提取需要的实体。

因此,我们应在合适的地方选择GetObjectByKey方法来获取数据,以减少对数据库的访问提升性能。示例代码如下:

[Test]

public void GetByKeyTest()

{

using (var db = new NorthwindEntities1())

{

//从数据库中提取数据

var cst = db.Customers.First(c => c.CustomerID == "ALFKI");

Console.WriteLine(cst.CustomerID);

//将从缓存中提取数据

EntityKey key = new EntityKey("NorthwindEntities1.Customers", "CustomerID","ALFKI");

var cst1 = db.GetObjectByKey(key) as Customers;

Console.WriteLine(cst1.CustomerID);

}

}

此外,需要注意的是如果GetObjectByKey没有获取到符合条件的数据,那么它会抛异常。为了避免此情况发生,在有可能出现异常的地方,我们应该使用TryGetObjectByKey方法。TryGetObjectByKey方法获取数据的方式和GetObjectByKey类似,只是当没有取到符合条件的数据时,TryGetObjectByKey会返回null而不是抛异常。示例代码如下:

[Test]

public void TryGetByKeyTest()

{

using (var db = new NorthwindEntities1())

{

//没有符合条件的数据会有异常抛出

EntityKey key = new EntityKey("NorthwindEntities1.Customers", "CustomerID","♂风车车.Net");

var cst = db.GetObjectByKey(key) as Customers;

Console.WriteLine(cst.CustomerID);

//没有符合条件的数据会有返回null

EntityKey key1 = new EntityKey("NorthwindEntities1.Customers", "CustomerID","♂风车车.Net");

Object cst1 = null;

db.TryGetObjectByKey(key1, out cst1);

if (cst1 != null)

Console.WriteLine(((Customers)cst1).CustomerID);

}

}

l         First /FirstOrDefault

First: 当我们使用First来获取数据,如果没有符合条件的数据,那么我们的代码将会抛出异常。

FirstOrDefault: 当我们使用FirstOrDefault来获取的数据,如果没有符合条件的数据,那么它将返回null。

显然,对于一个良好的代码,是对可以预见的异常进行处理,而不是等它自己抛出来。示例代码如下:

[Test]

public void FirstTest()

{

using (var db = new NorthwindEntities1())

{

//抛异常的代码

var cst = db.Customers.First(c => c.CustomerID == "♂风车车.Net");

Console.WriteLine(cst.CustomerID);//此处将出抛异常

//推荐的使用如下代码:

var cst1 = db.Customers.FirstOrDefault(c => c.CustomerID == "♂风车车.Net");

if (cst1 != null)

Console.WriteLine(cst1.CustomerID);

}

}

l         延迟加载/Include

EF不支持实体的部分属性延迟加载,但它支持实体关系的延迟加载。默认情况,实体的关系是不会加载。如下代码:

[Test]

public void IncludeTest()

{

using (var db = new NorthwindEntities1())

{

var csts = db.Customers;

foreach (var c in csts)

{

Console.WriteLine(c.CustomerID);

foreach (var o in c.Orders)

Console.WriteLine("   " + o.OrderID);

}

}

}

上述代码中,因为Orders没有被加载,所以在输出Orders的时候,是不会有任何输出的。

当我们需要加载某些关联的关系时,可是用Include方法,如下代码所示:

[Test]

public void IncludeTest()

{

using (var db = new NorthwindEntities1())

{

var csts = db.Customers.Include("Orders");

foreach (var c in csts)

{

Console.WriteLine(c.CustomerID);

foreach (var o in c.Orders)

Console.WriteLine("   " + o.OrderID);

}

}

}

上述代码中,Customers关联的Orders将被加载。

Entity Framework 学习高级篇1—改善EF代码的方法(上)的更多相关文章

  1. Entity Framework 学习高级篇2—改善EF代码的方法(下)

    ,IQueryable<Customers>>( (database) => database.Customers.Where(c => c.City == " ...

  2. 【.NET-EF】Entity Framework学习笔记1 - VS2013没有EF的解决方法

    解决方法:我本来也没有,百度了一下,在C:\ProgramData\Package Cache\{08AEF86A-1956-4846-B906-B01350E96E30}v12.0.20912.0\ ...

  3. Entity Framework 学习中级篇1—EF支持复杂类型的实现

    本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...

  4. Entity Framework学习初级篇2

    Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager类的介绍 本节,简单的介绍E ...

  5. 改善EF代码的方法(下)

    本节,我们将介绍一些改善EF代码的方法,包括编译查询.存储模型视图以及冲突处理等内容. > CompiledQuery 提供对查询的编译和缓存以供重新使用.当相同的查询需要执行很多遍的时候,那么 ...

  6. 改善EF代码的方法(上)

    本节,我们将介绍一些改善EF代码的相关方法,如NoTracking,GetObjectByKey, Include等. > MergeOption.NoTracking 当我们只需要读取某些数据 ...

  7. Entity Framework 学习初级篇1--EF基本概况

    转自:http://www.cnblogs.com/Tally/archive/2012/09/14/2685011.html 最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不 ...

  8. Entity Framework学习初级篇1--EF基本概况《转》

    最近在学习研究微软的EF,通过这时间的学习研究,感觉这个EF目前来说还不是很完善,半成品.不过,据说在.Net4.0中,微软将推荐使用此框架,并会有所改善.而且,现在基本上所有数据库均提供了对EF的支 ...

  9. Entity Framework 学习初级篇--EntityClient(转)

    摘自:http://www.cnblogs.com/xray2005/archive/2009/05/13/1456374.html System.Data.EntityClient 命名空间是 实体 ...

随机推荐

  1. Linux常用操作

    1. Latex参考文献格式 http://blog.163.com/sunkun_hust/blog/static/204454119201482524222283/

  2. 成都IT公司面经及公司评价

    从2015年年底到2016年初找了几个月工作,面了大大小小若干公司,有很不错的公司,也有很多坑公司,与君共勉. 1.科大讯飞 地址:成都分公司位于天府软件园E区,占一层楼.面积挺大.公司装修风格很舒服 ...

  3. javaWEB总结(12):JSP页面的九个隐含对象

    前言 jsp本质上是一个servlet,而在jsp中有九个不用声明就可以使用的对象,我们叫他隐含对象.本文基于上文所写,如有需要可查看上一篇文章javaWEB总结(11):JSP简介及原理. 打开上次 ...

  4. ZooKeeper搭建

    ZooKeeper系列之一:ZooKeeper简介 ZooKeeper 是一个为分布式应用所设计的分布的.开源的协调服务.分布式的应用可以建立在同步.配置管理.分组和命名等服务的更高级别的实现的基础之 ...

  5. js-常用数组方法总结

    [前面的话]说数组“万能”,可能夸张了一点,但是就个人观点,数组的运用是非常广泛的,这里的广泛当然也包含了在其他语言中的运用.举例说明,在javascript当中,由于字符串的不可变性,在进行字符串拼 ...

  6. HDU 4247 A Famous ICPC Team

    Problem Description Mr. B, Mr. G, Mr. M and their coach Professor S are planning their way to Warsaw ...

  7. json格式数据 ,将数据库中查询的结果转换为json(方式2)

    controller: /*** * 返回所有版本的信息,json的形式返回到前台 * @return */ @RequestMapping(value="/getAllVersion&qu ...

  8. WindowsAzure上把WebApp和WebService同时部署在一个WebRole中

    注:本文为个人学习转载,原文地址:http://blog.csdn.net/zztfj/article/details/6740327 最近开发一个和WindowsAzure相关的应用,该应用还调用了 ...

  9. chapter9_4 非抢占式的多线程

    协同程序与常规的多线程不同之处:协同程序是非抢占式的. 当一个协同程序运行时,是无法从外部停止它的.只有当协同程序显式地调用yield时,它才会停止. 当不存在抢先时,编程会变得简单很多,无须为同步的 ...

  10. spring容器启动的加载过程(二)

    第六步: public abstract class AbstractApplicationContext extends DefaultResourceLoader implements Confi ...