ADO.NET Entity Framework 学习初级篇5--ObjectQuery查询及方法

ObjectQuery 类支持对 实体数据模型 (EDM) 执行 LINQ to Entities 和 Entity SQL 查询。ObjectQuery 还实现了一组查询生成器方法,这些方法可用于按顺序构造等效于 Entity SQL 的查询命令。下面是 ObjectQuery 的查询生成器方法以及等效的 Entity SQL 语句:

  1. Distinct,Except,GroupBy,Intersect,OfType,OrderBy,Select,SelectValue,Skip,Top,Union,UnionAll,Where
复制代码

每个查询生成器方法返回 ObjectQuery 的一个新实例。使用这些方法可以构造查询,而查询的结果集基于前面 ObjectQuery 实例序列的操作。下面来看具体的代码片断:

l          Execute方法:

  1. using (var edm = new NorthwindEntities())
  2.         {
  3.                 string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql);
  5.                 ObjectResult<Customers> results = query.Execute(MergeOption.NoTracking);
  6.                 Assert.AreEqual(results.Count(), 10);
  7.                 foreach (Customers c in query)
  8.                     Console.WriteLine(c.CustomerID);
  9.             }
复制代码

其中需要说明的是: MergeOption这个枚举类型的参数项,MergeOption有四种值分别是:

l          AppendOnly: 只追加新实体,不修改以前获取的现有实体。这是默认行为。

l          OverwriteChanges: 将 ObjectStateEntry 中的当前值替换为存储 区中的值。这将使用服务器上的数据重写在本地所做的更改。

l          PreserveChanges: 将替换原始值,而不修改当前值。这对于在发生开放式并发异常之后强制成功保存本地值非常有用。

l          NoTracking: 将不修改 ObjectStateManager,不会获取与其他对象相关联的关系,可以改善性能

l          GetResultType方法:返回查询结果的类型信息.例如:

  1. using (var edm = new NorthwindEntities())
  2.             {
  3.                 string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql);
  5.                 Console.WriteLine(query.GetResultType().ToString());
  6.                 //输出结果为:
  7.                 //NorthWindModel.Customers
  8.             }
复制代码

l          ToTraceString方法:获取当前执行的SQL语句。

l          Where

实例代码如下:

  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql = "select value c from NorthwindEntities.Customers as c ";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql);
  5.                 //使用ObjectParameter的写法             
  6.                 query1 = query1.Where("it.CustomerId=@customerid");
  7.                 query1.Parameters.Add(new ObjectParameter("customerid", "ALFKI"));
  8.                 //也可以这样写
  9.                 //ObjectQuery<Customers> query2 = edm.Customers.Where("it.CustomerID='ALFKI'");
  10.                 foreach (var c in query1)
  11.                     Console.WriteLine(c.CustomerID);
  12.                 //显示查询执行的SQL语句
  13.                 Console.WriteLine(query1.ToTraceString());
  14.              
  15.             }
复制代码

l          First/ FirstOrDefault

实例代码如下:

  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query = edm.CreateQuery<Customers>(esql);
  5.                 Customers c1 = query.First();
  6.                 Customers c2 = query.FirstOrDefault();
  7.                 Console.WriteLine(c1.CustomerID);
  8.                 Assert.IsNotNull(c2);
  9.                 Console.WriteLine(c2.CustomerID);
  10.       }
复制代码

l          Distinct

实例代码如下:

  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql = "select value c.City from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<string> query = edm.CreateQuery<string>(esql);
  5.                 query = query.Distinct();
  6.                 foreach (string c in query)
  7.                 {
  8.                     Console.WriteLine("City {0}", c);
  9.                 }
  10.     }
复制代码

l          Except:返回两个查询的差集。实例代码如下:

  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 string esql2 = "select value c from NorthwindEntities.Customers as c where c.Country='UK' order by c.CustomerID limit 10";
  6.                 ObjectQuery<Customers> query2 = edm.CreateQuery<Customers>(esql2);
  7.                 query1 = query1.Except(query2);
  8.                 foreach (Customers c in query1)
  9.                 {
  10.                     Console.WriteLine(c.Country);
  11.                     //输出:UK
  12.                 }
  13.         }
复制代码

l          Intersect:返回两个查询的交集。实例代码如下:

  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 string esql2 = "select value c from NorthwindEntities.Customers as c where c.Country='UK' order by c.CustomerID limit 10";
  6.                 ObjectQuery<Customers> query2 = edm.CreateQuery<Customers>(esql2);
  7.                 query1 = query1.Intersect(query2);
  8.                 foreach (Customers c in query1)
  9.                 {
  10.                     Console.WriteLine(c.Country);
  11.                 }
  12.       }
复制代码
l          Union/UnionAll:返回两个查询的合集,包括重复项。其中UnionAll必须是相同类型或者是可以相互转换的。

l          Include:可通过此方法查询出与相关的实体对象。实例代码如下:
  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c WHERE c.CustomerID ='HANAR'";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 query1 = query1.Include("Orders");
  6.                 foreach (Customers c in query1)
  7.                 {
  8.                     Console.WriteLine("{0},{1}", c.CustomerID, c.Orders.Count);
  9.                     //输出:HANAR,14
  10.                 }
  11.     }
复制代码
l          OfType: 根据制定类筛选元素创建一个新的类型。此类型是要在实体模型中已定义过的。

l          OrderBy

实例代码如下:
  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 query1.OrderBy("it.country asc,it.city asc");
  6. //也可以这样写               
  7. //query1.OrderBy("it.country asc");
  8.                 //query1.OrderBy("it.city asc");
  9.                 foreach (Customers c in query1)
  10.                 {
  11.                     Console.WriteLine("{0},{1}", c.Country, c.City);
  12.                 }
  13.       }
复制代码
l          Select

实例代码如下:
  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 ObjectQuery<DbDataRecord> records = query1.Select("it.customerid,it.country");
  6.                 foreach (DbDataRecord c in records)
  7.                 {
  8.                     Console.WriteLine("{0},{1}", c[0], c[1]);
  9.                 }
  10.                 Console.WriteLine(records.ToTraceString());
  11.                 //SQL输出:
  12.                 //SELECT TOP (10)
  13.                 //1 AS [C1],
  14.                 //[Extent1].[CustomerID] AS [CustomerID],
  15.                 //[Extent1].[Country] AS [Country]
  16.                 //FROM [dbo].[Customers] AS [Extent1]
  17.                 //ORDER BY [Extent1].[CustomerID] ASC
  18.       }
复制代码
l          SelectValue

实例代码如下:
  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 ObjectQuery<string> records = query1.SelectValue<string>("it.customerid");
  6.                 foreach (string c in records)
  7.                 {
  8.                     Console.WriteLine("{0}", c);
  9.                 }
  10.                 Console.WriteLine(records.ToTraceString());
  11.                 //SQL输出:
  12.                 //SELECT TOP (10)
  13.                 //[Extent1].[CustomerID] AS [CustomerID]
  14.                 //FROM [dbo].[Customers] AS [Extent1]
  15.                 //ORDER BY [Extent1].[CustomerID] ASC
  16.       }
复制代码
l          Skip/Top

实例代码如下:
  1. using (var edm = new NorthwindEntities())
  2.     {
  3.                 string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID ";
  4.                 ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);
  5.                 query1 = query1.Skip("it.customerid asc", "10");
  6.                 query1 = query1.Top("10");
  7.                 foreach (Customers c in query1)
  8.                 {
  9.                     Console.WriteLine("{0}", c.CustomerID);
  10.                 }
  11.                 Console.WriteLine(query1.ToTraceString());
  12.                 //SQL输出:
  13.                 //SELECT TOP (10)
  14.                 //[Extent1].[CustomerID] AS [CustomerID]
  15.                 //FROM [dbo].[Customers] AS [Extent1]
  16.                 //ORDER BY [Extent1].[CustomerID] ASC
  17. }
复制代码
本节,简单的介绍一下与ObjectQuery查询相关的语法,我个人觉得查询写法比较多,需要在日常的编程中去发现,在这里就不一一复述了。下节,将介绍EntityClient相关的内容。(文/ ♂风车车.Net
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值