zoukankan      html  css  js  c++  java
  • Entity Framework 学习总结之七:EntitySQL 基本查询

    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 ROWSELECT VALUE两类。如果直接写SELECTEntity 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。如果您只是希望以非确定的方式限制结果中的行数,则应使用 TOPTOP 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

  • 相关阅读:
    log输出到日志和控制台
    CRM--搜索功能
    CRM--对数据进行排序
    CRM-注意的小事情
    CRM--modelform之instance
    CRM--保留原搜索条件
    crm系统
    Django多个app情况下静态文件的配置
    测试
    题库
  • 原文地址:https://www.cnblogs.com/astar/p/EntitySQL_SELECT.html
Copyright © 2011-2022 走看看