复杂查询及函数
外键
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。