Entity Framework 学习总结之八:EntitySQL 复杂查询及函数

复杂查询及函数

外键

Entity SQL 与其它的查询一样,可以通过外键的关系直接取值或判断,如:

using (var edm = new NorthwindEntities ())

{

    string sqlStr = "SELECT VALUE o FROM NorthwindEntities.Orders AS o WHERE o.Customers.Country = 'Mexico'" ;

 

    ObjectQuery <Orders > query = edm.CreateQuery<Orders >(sqlStr);

    ObjectResult <Orders > result = query.Execute(MergeOption .NoTracking);

 

 

    foreach (Orders o in result)

    {

        Console .WriteLine("{0},{1}" , o.OrderID, o.Customers.Address);

    }

 

    Console .WriteLine(query.ToTraceString());

}

 

我们直接用 o.Customers.Country 这是一个一对多的外键关系。

 

注: “ NorthwindEntities.Orders ” 中的 “ NorthwindEntities ” 可以省略的!

 

GroupBy

对数据进行分组查询可以使用以下语法:

SELECT o . OrderDate , Count ( o . OrderID ) AS Count FROM NorthwindEntities . Orders AS o GROUP BY o . OrderDate

直接进行 Group by 操作,而进行分组时也可以使用 Count 、 Max 、 Min 、 Sum 、 Avg 这几个函数,使用方法与 SQL 没有什么不同。

 

统计函数

Entity SQL 同样支持统计函数: Avg , BigCount,Count,Max,Min,StDev,Sum 。

 

类型转换

Null 文本与 Entity SQL 类型系统中的任何类型都兼容,可以使用 cast 进行类型转换,例如:

SELECT Length ( cast (e . Notes as string) ) from NorthwindEntities . Employees as e where e . EmployeeID = 1

 

其中, Nvarchar 等可以成 string ,数字类型可以转成 int32 ,其他的类型转换类似。如果无法完成转换,则将报异常。

 

字符串函数

我们先查询出一个字符串供下面函数演示使用:

SELECT e.Notes from NorthwindEntities . Employees as e where e.EmployeeID=1

 

-- 结果: Education includes a BA in psychology from Colorado State University in 1970. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.

 

IndexOf : 获取前面字符串在后面字符串中的位置。

SELECT IndexOf ( 'i' , e . Notes ) from NorthwindEntities . Employees as e where e . EmployeeID = 1

-- 结果: 7

 

Right : 获取前面字符串从右面的 N 个字符,注意字符串必须要转换。
SELECT Right ( cast (e.Notes as string) ,14) from NorthwindEntities . Employees as e where e.EmployeeID=1

-- 结果: International.

 

Left : 同上

 

Length : 获取字符串长度。

SELECT Length ( cast (e . Notes as string) ) from NorthwindEntities . Employees as e where e . EmployeeID = 1

-- 结果: 175

 

SUBSTRING : 截取字符串,从字符串中 A 开始截取长度为 B 个字符。

SELECT SUBSTRING ( e.Notes,2,10 ) from NorthwindEntities . Employees as e where e . EmployeeID = 1

-- 结果: ducation i

 

LTrim 、 RTrim 、 Trim : 分别为删除字符串左、右、两侧空格。

SELECT Trim ( SUBSTRING ( e.Notes,2,9 )) from NorthwindEntities . Employees as e where e . EmployeeID = 1

-- 结果: ducation

 

Replace : 将字符串参数 A 中的字符串参数 B 替换为字符串参数 C 。

SELECT Replace ( cast (e.Notes as string), 'includes' , 'Astar' ) from NorthwindEntities . Employees as e where e . EmployeeID = 1

-- 结果: Education Astar a BA in psychology from Colorado State University in 1970. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.

 

ToLower 、 ToUpper : 大小写转换。

 

Reverse : 将字符串反转。

SELECT Reverse ( cast (e.Notes as string) ) from NorthwindEntities . Employees as e where e . EmployeeID = 1

-- 结果: .lanoitanretnI sretsamtsaoT fo rebmem a si ycnaN ".llaC dloC eht fo trA ehT" detelpmoc osla ehS .0791 ni ytisrevinU etatS odaroloC morf ygolohcysp ni AB a sedulcni noitacudE

 

数字函数

四舍五入: Round(1.4)

向下取整: Floor(1.9) >> 1

向上取整: Ceiling(1.1) >> 2

 

时间函数

当前时间: CurrentDateTime() >> 2011/1/6 20:34:09

格林威治时间: CurrentUtcDateTime()

年、月、日、时、分、秒: Year(e.BirthDate),Month(e.BirthDate),Day(e.BirthDate),Hour(e.BirthDate),Minute(e.BirthDate),Second(e.BirthDate)

 

GUID NewGuid () >>4131d481-2291-4fe9-8756-6e2b1d99f607

 

位计算函数

如果提供 Null 输入,则这些函数返回 Null 。这些函数的返回类型与参数类型相同。如果函数采用多个参数,则这些参数必须具有相同的类型。若要对不同类型执行位运算,则需要显式强制转换为相同类型。( BitWiseAnd,BitWiseNot,BitWiseOr,BitWiseXo )

 

集合运算符

Set(Colleciton) :我们假定 Collection 中可以包含重复元素,那么, Set(Collection) 就取出 Collection 中的非重复的元素。

例如: Set({1,1,3,3,4}) 将得到结果 {1,3,4} 。

 

e IN collection : IN 运算符返回 e 是否在 collection 中。

例如: 1 IN {1,2,3} 返回 TRUE , 1 IN {-1,-2,-3} 返回 FALSE 。

 

EXISTS(collection) :判定 collection 是否为空,为空时返回 FALSE ,否则,返回 TRUE 。

例如: EXISTS({1}) 返回 TRUE ;而 EXISTS(SELECT V from {1,2,3} AS V WHERE V=-1) 返回 FALSE 。

 

collectionA UNION [ALL] collection : UNION 求两个集合的并集,并且去除相同的元素;而 UNION ALL 求两个集合并集,但是,同时包含重复元素。

例如: {1,2,3} UNION {2,3,4} 得到 {1,2,3,4} ,而 {1,2,3} UNION ALL {2,3,4} 得到 {1,2,3,2,3,4} 。

 

collecitonA INTERSECT collectionB : INTERSECT 求两个集合的交集。

例如: {1,2,3} INTERSECT {2,3} 得到 {2,3} 。注意,交集会去除重复元素。 {1,2,2,3} INTERSECT {2,2,3} 得到 {2,3} ,而非 {2,2,3}

 

collecitonA EXCEPT collecitonB : A EXCEPT B 代表:从 A 集合里减去 B 集合的元素。换句话说,就是取得 A 中有 B 中没有的元素。

例如: {1,2,3} EXCEPT {2,3} 将得到 {1} 。

 

collecitonA OVERLAPS collectionB : A OVERLAPS B 将判定 A 、 B 集合是否有交集,有则返回 TRUE ,没有则返回 FALSE 。其相当于 EXISTS(A INTERSECT B) 。

例如: {1,2,3} OVERLAPS {3,4} 返回 TRUE ,而 {1,2,3} OVERLAPS {4,5} 返回 FALSE 。

 

ANYELEMENT(collection) : ANYELEMENT 随机返回集合中的任意一个元素。

例如: ANYELEMENT({1,2,3}) 有可能返回 1 ,有可能返回 2 也有可能返回 3 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值