ObjectQuery 类支持对实体数据模型(EDM)执行LINQ to Entities和Entity SQl查询。ObjectQuery还实现了一组查询生成器方法,这些方法可用于按顺序构造等效于Entity SQl的查询命令。下面是ObjectQuery的查询生成器方法以及等效的Entity SQl语句:
Distinct,Except,GroupBy,Intersect,OfType,OrderBy,Select,SelectValue,Skip,Top,Union,UnionAll,Where
每个查询生成器方法返回ObjectQuery的一个新实例。使用这些方法可以构造查询,而查询的结果集基于前面ObjectQuery实例序列的操作。下面来看具体的代码片断:
l Execute方法:
using (var edm = new NorthwindEntities())
{
string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql );
ObjectResult<Customers> results = query.Execute(MergeOption.NoTracking);
Assert.AreEqual (results.Count(), 10);
foreach (Customers c in query)
Console.WriteLine(c.CustomerID);
}
其中需要说明的是: MergeOption这个枚举类型的参数项,MergeOption有四种值分别是:
l AppendOnly:只追加新实体,不修改以前获取的现有实体。这是默认行为。
l OverwriteChanges:将 ObjectStateEntry 中的当前值替换为存储区中的值。这将使用服务器上的数据重写在本地所做的更改。
l PreserveChanges:将替换原始值,而不修改当前值。这对于在发生开放式并发异常之后强制成功保存本地值非常有用。
l NoTracking:将不修改 ObjectStateManager,不会获取与其他对象相关联的关系,可以改善性能。
l GetResultType方法:返回查询结果的类型信息.例如:
using (var edm = new NorthwindEntities())
{
string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql );
Console.WriteLine(query.GetResultType().ToString());
//输出结果为:
//NorthWindModel .Customers
}
l ToTraceString方法:获取当前执行的SQL语句。
l Where
实例代码如下:
using (var edm = new NorthwindEntities())
{
string esql = "select value c from NorthwindEntities.Customers as c ";
ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql );
//使用ObjectParameter的写法
query1 = query1.Where("it.CustomerId=@customerid");
query1.Parameters.Add(new ObjectParameter("customerid", "ALFKI"));
//也可以这样写
//ObjectQuery<Customers> query2 = edm.Customers.Where("it.CustomerID=''ALFKI''");
foreach (var c in query1)
Console.WriteLine(c.CustomerID);
//显示查询执行的SQL语句
Console.WriteLine(query1.ToTraceString());
}
l First/ FirstOrDefault
实例代码如下:
using (var edm = new NorthwindEntities())
{
string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql );
Customers c1 = query.First();
Customers c2 = query.FirstOrDefault();
Console.WriteLine(c1.CustomerID);
Assert.IsNotNull (c2);
Console.WriteLine(c2.CustomerID);
}
l Distinct
实例代码如下:
using (var edm = new NorthwindEntities())
|