在EF中,查询对象模型有很多种方式:
1)通过Object Services执行LINQ to Entities。
2)通过Object Services执行查询构建方法(查询构建方法可以用来构建Entity SQL)。
3)通过Object Services执行Entity SQL。
4)通过Entity Client层执行Entity SQL。
第一种是最为广泛使用的方法。
Object Services最重要的类是ObjectContext,它提供了执行LINQ to Entities查询的唯一入口,Visual Studio设计器除了产生实体类外,还产生了一个继承自ObjectContext的类,这个类针对每一个实体对象暴露出一个实体集属性,实体集用ObjectSet<T>类型来描述。例如下面是自动生成的ObjectContext,其中含有Order实体集的访问属性:
public partial class OrderITEntities : ObjectContext
{
public ObjectSet<Order> Orders
{
get
{
return _orders ?? (_orders = CreateObjectSet<Order>("Orders"));
}
}
private ObjectSet<Order> _orders;
}
设计器产生的ObjectContext类给我们提供了访问实体集的属性和一些常用的方法,它是EF操作实体对象的推荐方式。
1、LINQ to Entities查询原理
ObjectSet<T>实现了IQueryable<T>,这个接口的成员引用一个实现了IQueryProvider接口的对象,而Entity Framework提供了自身的IQueryProvider,这使得EF具有了分析查询并产生SQL语句的能力。LINQ to Entities查询原理如图:
2、捕获产生的SQL
Object Service提供了ToTraceString方法,用来查看产生的SQL语句:
var result = ctx.Orders.Where(o => o.Date.Year == DateTime.Now.Year);
var sql = (result as ObjectQuery).ToTraceString();