ObjectQuery查询及方法

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("[email protected]");

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

}

时间: 2024-08-10 17:18:26

ObjectQuery查询及方法的相关文章

几种更新(Update语句)查询的方法

正 文: 数据库更新就一种方法Update,其标准格式:Update 表名 set 字段=值 where 条件只是依据数据的来源不同,还是有所差别的:  1.从外部输入这样的比較简单例:update tb set UserName="XXXXX" where UserID="aasdd" 2.一些内部变量,函数等,比方时间等直接将函数赋值给字段update tb set LastDate=date() where UserID="aasdd" 3

Spring查询方法的注入 为查询的方法注入某个实例

//这里是客户端的代码 当调用CreatePersonDao这个抽象方法或者虚方法的时候由配置文件返回指定的实例 为查询的方法注入某个实例 start static void Main(string[] args)        {            IApplicationContext ctx = ContextRegistry.GetContext();            Console.WriteLine("查询方法");            ObjectFactor

Oracle 特殊字符模糊查询的方法

最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据. 这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询. 首先理解一下什么是特殊字符. 在ascii码表中,特殊字符的范围如下.即从32~47 58~64 91~96 123~126. 模糊查询时,有两种方法可以进行转换. 1. 使用REGEXP_LIKE方法,这是个使用正则表达式来查询的方法,因此有此字符需要进行转义才能查询,如$ *等,转义符为反斜

py查询文件方法例子

mport os def findExtension(path,el): if(os.path.exists(path)): try: items=os.listdir(path) for item in items: if(os.path.isfile(os.path.join(path,item))): print (item,el) else: findExtension(os.path.join(path,item),el) except Exception,message: print

JS 实现Json查询的方法实例

其实很简单,我这部分代码,前一部分是简单的实现如何使用JS写模板,第二个就是具体的实现了JSON查询的一个扩展. 以后查询Json就有了利器了. 代码如下: /*         * 定义模板函数        */        var template = function (queryArr) { var count = 0; for (var i = 0; i < queryArr.length; i++) { var e = queryArr[i]; if ($express) {  

sql serve 跨服务器查询数据方法

 今天在做sql server 的数据查询时,需要用到跨服务器连接,在这里记录一下,如何在sql server 中,使用跨服务器查询的方法,有以下步骤. /* 创建中间数据库链接 exec sp_addlinkedserver 'MiddleData', ' ', 'SQLOLEDB', '数据库连接实例,或者IP' exec sp_addlinkedsrvlogin 'MiddleData', 'false',null, '数据库连接帐号', '数据库连接密码' */ 创建好连接之后,就可

Criteria Query常用的查询限制方法

 Restrictions.like(属性名, 查询条件的值, 匹配方式): Restrictions.in(属性名, 查询条件的值, 匹配方式): Restrictions.eq(属性名, 查询条件的值, 匹配方式): CriteriaQuery常用的查询限制方法 Restrictions.eq() equal,= Restrictions.allEq() 参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果 Restriction

MySQL、SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法

在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法. 可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用. 下面就分别给大家介绍.讲解一下三种数据库实现分页查询的方法. 一. MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数.一般只需要直接写到sql语句后面就行了. LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有

数据库优化查询的方法以及大访问量到数据库时的优化

一.数据库优化查询的方法 1.使用索引: 应尽量避免全表扫描,首先考虑在where 以及 order by  ,group  by 涉及的列上建立索引 2.优化SQL语句: 1>通过explain(查询优化神器)用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句.通常我们可以对比较复杂的尤其是涉及到多表的SELECT语句,把关键字explain加到前面,查看执行计划,例如: explain select * from news; 2>任何地方都不要使用sel