Entity SQL 基本查询
SWFGHO 是什么? SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY 的首字母缩写,也是 SQL 查询语句的最基本构成方法。 Entity SQL 是一种 " 仿 SQL" 的语言,因此,它在基本遵守 SFWGHO 的基础上,稍微加以扩展,形成了一套较 SQL 来得强大的查询语句。
表达式
Entity SQL 提供了一种最简单的查询方法 —— 表达式。一个表达式即一个查询语句。
举例说明,以下表达式均可以看作是 Entity SQL 的查询语句 ( 每行一个 ) :
1
1*2%3
MAX({1,3,4})
CASE WHEN MIN(MULTISET(-3,1,9))<0 THEN -100 ELSE 100 END
SUBSTRING('Hello',2,3)
正常的 Entity SQL 写法,例如:
select e from NorthwindEntities . Employees as e
select e .Address, e .City from NorthwindEntities . Employees as e order by e .City
结果:
注意:
· 不支持 SELECT * 操作,必须要 SELECT 列或者实体的别名。
· 建议显式的使用 AS 关键字。虽然在有些情况下, Entity SQL 可以 自动推断别名 ,但有时候,就会出错。因此,显式使用 AS 来声明别名有助于减少错误。
· 不区分大小写。
· ESQL 后面的分号可以省略。
操作符
Entity SQL 支持如下操作符:
优先级 作用与类型 符号
1 层级 .,()[]
2 非 ! not
3 乘除 * / %
4 加减 +-
5 比较 < > <= >=
6 相等 = != <>
7 与 and &&
8 或 or ||
标识符
Entity SQL 提供两种标识符:简单标识符和带引号的标识符。
简单标识符: Entity SQL 中的简单标识符是字母数字和下划线字符的序列。标识符的第一个字符必须是字母字符( a-z 或 A-Z )。
带引号的标识符:带引号的标识符是括在方括号 ([]) 中的任何字符序列。带中文的部分,请使用方括号包括起来,否则会报如下异常信息: “ 简单标识符 “ 中文 ” 只能包含基本拉丁字符。若要使用 UNICODE 字符,请使用转义标识符 ” 。
正确的代码如下: Select c . CustomerID as [ 中文字符 ] from NorthwindEntities . Customers as c order by c . CustomerID skip 0 limit 10
SELECT ROW 和 SELECT VALUE
在 Entity SQL 中, SELECT 又可细分为 SELECT ROW 和 SELECT VALUE 两类。如果直接写 SELECT , Entity SQL 将永远返回行对象集合 —— 即使指定了只返回某一列属性。因此,如果这样写,我们会用类似以下的代码来访问数据:
using (var edm = new NorthwindEntities ())
{
string sqlStr = "select e.Address,e.City from NorthwindEntities.Employees as e order by e.City" ;
ObjectQuery <DbDataRecord > query = edm.CreateQuery<DbDataRecord >(sqlStr);
foreach (DbDataRecord rec in query.Execute(MergeOption .NoTracking))
{
Console .WriteLine(rec["Address"] );
}
Console .WriteLine(query.ToTraceString());
}
Entity SQL 提供了 SELECT VALUE 子句以跳过隐式行构造。 SELECT VALUE 子句中只能指定一项。在使用这样的子句时,将不会对 SELECT 子句中的项构造行包装器,并且可生成所要形状的集合。如果使用 SELECT VALUE ,就可以直接返回这个值,而不使用行来进行返回。例如:
using (var edm = new NorthwindEntities ())
{
//VALUE 后面只能写一个。
string sqlStr = "select VALUE e.Address from NorthwindEntities.Employees as e order by e.City" ;
ObjectQuery <string > query = edm.CreateQuery<string >(sqlStr);
foreach (string result in query.Execute(MergeOption .NoTracking))
{
Console .WriteLine(result );
}
Console .WriteLine(query.ToTraceString());
}
直接查询实体:
using (var edm = new NorthwindEntities ())
{
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e order by e.City" ;
ObjectQuery <Employees > query = edm.CreateQuery<Employees >(sqlStr);
foreach (Employees eTemp in query.Execute(MergeOption .NoTracking))
{
Console .WriteLine(eTemp.Address );
}
Console .WriteLine(query.ToTraceString());
}
WHERE
代码片断:可以使用 and 和 or 增加多条件判断。
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City = 'London' " ;
ObjectQuery <Employees > query = edm.CreateQuery<Employees >(sqlStr);
foreach (Employees eTemp in query.Execute(MergeOption .NoTracking))
{
Console .WriteLine(eTemp.City);
}
Top
SELECT 子句可以在可选的 ALL/DISTINCT 修饰符之后具有可选的 TOP 子子句。 TOP 子子句指定查询结果中将只返回第一组行。
...
string sqlStr = "select VALUE top (1) e from NorthwindEntities.Employees as e where e.City = 'London'" ;
另使用: “ Select top( 10 ) c . CustomerID from NorthwindEntities . Customers as c order by c . CustomerID ”
...
IN
...
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City in {'London','testCity'}" ;
...
LIKE
...
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City like '%nd%'" ;
...
Between And
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.EmployeeID between 1 and 100" ;
参数
代码片断:
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City = @city " ;
ObjectParameter[] ps = { new ObjectParameter("city", "London") };
ObjectQuery <Employees > query = edm.CreateQuery<Employees >(sqlStr, ps );
foreach (Employees eTemp in query.Execute(MergeOption .NoTracking))
{
Console .WriteLine(eTemp.City);
}
Console .WriteLine(query.ToTraceString());
Order By (asc/desc)
...
string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.EmployeeID between 1 and 100 order by e.EmployeeID desc" ;
...
SKIP/LIMIT 分页
可以通过在 ORDER BY 子句中使用 SKIP 和 LIMIT 子句执行物理分页。若要以确定的方式执行物理分页,应使用 SKIP 和 LIMIT 。如果您只是希望以非确定的方式限制结果中的行数,则应使用 TOP 。 TOP 和 SKIP/LIMIT 是互斥的。
以 CustomerID 排序,从第 2 条开始取 10 条记录:
Select value c from NorthwindEntities . Customers as c order by c . CustomerID skip 2 limit 10
Key
提取引用或实体表达式的键。如下 esql 语句,直接返回 Customer 表的主键:
SELECT value key( c ) FROM NorthwindEntities . Customers as c order by c . CustomerID LIMIT 10
CASE
和 TSQL 中的用法一样:
select case when c . CustomerID == 'BOLID' then true else false end from NorthwindEntities . Customers as c order by c . CustomerID limit 10