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())

{

string esql = "select value c.City from NorthwindEntities.Customers as c order by c.CustomerID limit 10";

ObjectQuery<string> query = edm.CreateQuery<string>(esql);

query = query.Distinct();

foreach (string c in query)

{

Console.WriteLine("City {0}", c);

}

}

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

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

string esql2 = "select value c from NorthwindEntities.Customers as c where c.Country='UK' order by c.CustomerID limit 10";

ObjectQuery<Customers> query2 = edm.CreateQuery<Customers>(esql2);

query1 = query1.Except(query2);

foreach (Customers c in query1)

{

Console.WriteLine(c.Country);

//输出:UK

}

}

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

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

string esql2 = "select value c from NorthwindEntities.Customers as c where c.Country='UK' order by c.CustomerID limit 10";

ObjectQuery<Customers> query2 = edm.CreateQuery<Customers>(esql2);

query1 = query1.Intersect(query2);

foreach (Customers c in query1)

{

Console.WriteLine(c.Country);

}

}

l           Union/UnionAll:返回两个查询的合集,包括重复项。其中UnionAll必须是相同类型或者是可以相互转换的。

l           Include:可通过此方法查询出与相关的实体对象。实例代码如下:

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c WHERE c.CustomerID ='HANAR'";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

query1 = query1.Include("Orders");

foreach (Customers c in query1)

{

Console.WriteLine("{0},{1}", c.CustomerID, c.Orders.Count);

//输出:HANAR,14

}

}

l           OfType: 根据制定类筛选元素创建一个新的类型。此类型是要在实体模型中已定义过的。

l           OrderBy

实例代码如下:

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

query1.OrderBy("it.country asc,it.city asc");

//也可以这样写

//query1.OrderBy("it.country asc");

//query1.OrderBy("it.city asc");

foreach (Customers c in query1)

{

Console.WriteLine("{0},{1}", c.Country, c.City);

}

}

l           Select

实例代码如下:

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

ObjectQuery<DbDataRecord> records = query1.Select("it.customerid,it.country");

foreach (DbDataRecord c in records)

{

Console.WriteLine("{0},{1}", c[0], c[1]);

}

Console.WriteLine(records.ToTraceString());

//SQL输出:

//SELECT TOP (10)

//1 AS [C1],

//[Extent1].[CustomerID] AS [CustomerID],

//[Extent1].[Country] AS [Country]

//FROM [dbo].[Customers] AS [Extent1]

//ORDER BY [Extent1].[CustomerID] ASC

}

l           SelectValue

实例代码如下:

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID limit 10";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

ObjectQuery<string> records = query1.SelectValue<string>("it.customerid");

foreach (string c in records)

{

Console.WriteLine("{0}", c);

}

Console.WriteLine(records.ToTraceString());

//SQL输出:

//SELECT TOP (10)

//[Extent1].[CustomerID] AS [CustomerID]

//FROM [dbo].[Customers] AS [Extent1]

//ORDER BY [Extent1].[CustomerID] ASC

}

l           Skip/Top

实例代码如下:

using (var edm = new NorthwindEntities())

{

string esql1 = "select value c from NorthwindEntities.Customers as c order by c.CustomerID ";

ObjectQuery<Customers> query1 = edm.CreateQuery<Customers>(esql1);

query1 = query1.Skip("it.customerid asc", "10");

query1 = query1.Top("10");

foreach (Customers c in query1)

{

Console.WriteLine("{0}", c.CustomerID);

}

Console.WriteLine(query1.ToTraceString());

//SQL输出:

//SELECT TOP (10)

//[Extent1].[CustomerID] AS [CustomerID]

//FROM [dbo].[Customers] AS [Extent1]

//ORDER BY [Extent1].[CustomerID] ASC

}

本节,简单的介绍一下与ObjectQuery查询相关的语法,我个人觉得查询写法比较多,需要在日常的编程中去发现,在这里就不一一复述了。下节,将介绍EntityClient相关的内容。

Entity Framework 学习初级篇5--ObjectQuery查询及方法的更多相关文章

  1. Entity Framework学习初级篇2

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

  2. Entity Framework 学习初级篇--基本操作:增加、更新、删除、事务(转)

    摘自:http://www.cnblogs.com/xray2005/archive/2009/05/17/1458568.html 本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作 ...

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

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

  4. Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务

    本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作相关的内容在之前的1至6节基本介绍完毕. l           增加: 方法1:使用AddToXXX(xxx)方法:实例代码如下: ...

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

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

  6. Entity Framework 学习初级篇2--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍

    本节,简单的介绍EF中的ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager这个几个比较重要的类,它们都位于System.Data ...

  7. Entity Framework 学习初级篇2--ObjectContext类的介绍

    转自:http://www.cnblogs.com/Tally/archive/2012/09/14/2685014.html 本节,简单的介绍EF中的ObjectContext.ObjectQuer ...

  8. Entity Framework 学习初级篇3-- LINQ TO Entities

    LINQ 技术(即 LINQ to Entities)使开发人员能够通过使用 LINQ 表达式和 LINQ 标准查询运算符,直接从开发环境中针对 实体框架对象上下文创建灵活的强类型查询.LINQ to ...

  9. Entity Framework学习初级篇3--LINQ TO Entities

    LINQ 技术(即LINQ to Entities)使开发人员能够通过使用LINQ 表达式和LINQ 标准查询运算符,直接从开发环境中针对实体框架对象上下文创建灵活的强类型查询.LINQ to Ent ...

随机推荐

  1. [NPOI2.0] 使用NPOI读取和导出Excel文件

    先来说下一直使用的 Microsoft.Office.Interop.Excel ,在系统正式使用时遇到的问题 1:Excel读取数据BUG 由于使用Microsoft.Office.Interop. ...

  2. 分珠(dfs+并查集)

    1140 分珠 时间限制:500MS  内存限制:65536K提交次数:24 通过次数:18 题型: 编程题   语言: G++;GCC Description 如下图所示,有若干珠子,每颗珠子重量不 ...

  3. chrome浏览器debug

    Chrome浏览器审查元素 1.Elements标签页 Elements标签页的左侧就是对页面HTML结构的查看与编辑,你可以直接在某个元素上双击修改元素的属性. 1.Edit as HTML直接对元 ...

  4. Android系统手机端抓包方法(tcpdump)

    抓包准备 1. Android手机需要先获得root权限.一种是否获得root权限的检验方法:安装并打开终端模拟器(可通过安卓市场等渠道获得).在终端模拟器界面输入su并回车,若报错则说明未root, ...

  5. 第二十节,基本数据类型,集合set、综合应用新数据更新老数据

    基本数据类型,集合set.综合应用新数据更新老数据 创建两个字典新数据,更新原始数据,a为原始数据,b为新数据 1,分别获取到a字典和b字典的key(键),将两个字典的键分别转换成两个集合 2,找出a ...

  6. /etc/fstab 文件解释

    /etc/fstab 文件解释 文件fstab包含了你的电脑上的存储设备及其文件系统的信息.它是决定一个硬盘(分区)被怎样使用或者说整合到整个系统中的唯一文件. 这个文件的全路径是/etc/fstab ...

  7. CSU 1004并查集

    试题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1004 题目分析: 讲述的主要是是否可以通过公交直接到达自己的目的地,如果最后将问题转换为 ...

  8. .Net TransactionScope事务

    使用TransactionScope类 正如名称所暗示,TransactionScope类用于限定事务代码块,其具有一些明显优点,例如范围与应用程序对象模型无关,同时提供了一个简单直观的编程模型等等. ...

  9. 【Machine Learning in Action --2】K-最近邻分类

    1.K-近邻算法(KNN)概述 K-近邻算法采用测量不同特征值之间的距离方法进行分类. 工作原理:存在一个样本数据集合(也称作训练样本集),并且样本集中每个数据都存在标签(即我们知道样本集中每一数据与 ...

  10. kubernetes 条件需求

    1. 你必须拥有一台安装有Docker的机器. 2. 你的内核必须支持 memory and swap accounting .确认你的linux内核开启了如下配置: CONFIG_RESOURCE_ ...