zoukankan      html  css  js  c++  java
  • 一起学习MVC(4)entity SQL语句

    Entity SQL 是类似于 SQL 的、与存储无关的语言。Entity SQL 旨在基于 实体数据模型 (EDM) 查询和处理对象的多功能对象图形。下面我们和SQL语句对比着来学习。ESQL语句是不区分大小写的。

    它支持以下功能 (摘在网上)

      支持与不支持的查询:

      from子句

      in和exists

      union, intersect, except来表示并交差集

      join表达式

      支持p.Address.City 这种级联查询

      不支持*操作

      group by时也要select k from T as t group by (t.x + t.y) as k这种方式

      

     首先从select开始:

       我们常见的SQL语句是:Select * from members

                        对应的ESQL语句就是:Select value m from members as m

                        这里的value是必须的 上面的语句也可以这么写:select value members  from members

    如果选择某一字段呢?select userid from members 

                   对应的ESQL语句就是:select value m.userid from members as m; 

    如果要选择一个以上的字段就和上面的不一样,ESQL语句里必须要使用row函数,TSQL:select userid from members 

                   对应的ESQL语句就是:select value row(m.userid,m.username) from members as m;  

    我们再看下面带where语句的标准SQL:select * from members where userid=1

                        对应的ESQL语句就是:select value m from members as m where m.userid=1

                        看到了区别了吧。

    那我们下面再写一个带top的SQL语句:select top 10 * from members where userid>0

                        对应的ESQL语句就是:select value top(10) m from members as m where m.userid>0 

    下面继续写一个ORDER BY 的语句:select * from members order by userid desc

                        对应的ESQL语句就是:SELECT value m from members as m order by m.userid desc

    如果有多个条件呢?select * from members order by userid desc,username desc

                        对应的ESQL语句就是:select value m from members as m order by m.userid desc,m.username desc

    是不是觉得很EZ??

    下面再将一个分页的,分页规则按照USERID降序分页,每页10条。

              在MYSQL里面如果要分页的话就可以用下面的SQL

                   select * from members order by userid desc limit,10,10

                   其中第一个参数就是从开始的行号,第二个参数是要获取的最多的记录数

              如果我们要在SQLSERVER里面的话就要这么写了

       select top 10 * from members where userid<(select min(userid) from (select top 10 userid from members order by userid desc) as u) order by userid desc

      呵呵,是不是太复杂了??如果我们要在ESQL里面分页怎么办??这时可以使用两个函数skip 和 limit,看一下下面的写法:

    select value m from members as m order by m.userid desc skip(10) limit(10)

    这里的skip和limit不能脱离order by 子句,skip的意思是说跳过多少行,limit的意思就是选中行的数目,两个函数也可以单独使用,比如

    select value m from members as m order by m.userid desc skip(10) 跳过前10行,返回从第11行(包含第11行)以后的所有记录

    select value from members as m order by m.userid desc limit(10) 显示前10行记录和TOP的作用是一样的。

    需要注意的一点就是:skip和top如果同时使用的话,该查询表达式无效,必须重写查询表达式,使用limit函数

    接下来我们一起学习group by  IN EXISTS语句,还是老思路对比着TSQL来学ESQL     。

      首先学习group by我们来看一下TSQL:select count(*) from orders group by userid

                        对应的ESQL语句:select value count(k) from Orders as t group by t.userid as k 

                      当然我们也可以使用其他聚合函数max,min,sum,avg,我这里就不一一演示了

                         group by 后面的字段不用别名可以不?答案是可以的            

    再看下面的TSQL语句:select count(*),userid from orders group by userid

                        对应的ESQL语句:select value row(count(k),k) from orders as t group by t.userid as k

    说了这些多,怎么执行ESQL语句呢?

                b2cDBEntities db = new b2cDBEntities();
                
    string sql = "select value m from members as m";
                var query 
    = db.CreateQuery<Members>(sql);

                
    foreach (var k in query)
                {
                    Console.WriteLine(k.UserID);
                }

    当然也可以象执行ADO.NET对象一样执行

    string ConnectionString = "metadata=res://*/StoreModel.csdl|res://*/StoreModel.ssdl|res://*/StoreModel.msl;provider=System.Data.SqlClient;provider connection string=';Data Source=.;Initial Catalog=b2cDB;Integrated Security=True;MultipleActiveResultSets=True';";
                
    using (EntityConnection conn = new EntityConnection(ConnectionString))
                {
                    conn.Open();
                    EntityCommand cmd 
    = conn.CreateCommand();
                    
    string sql = "select VALUE m from b2cDBEntities.members as m";
                    cmd.CommandText 
    = sql;
                    EntityDataReader dr 
    = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
                    
    while (dr.Read())
                    {
                        Console.WriteLine(dr[
    "UserID"]);
                    }
                    dr.Close();
                }
  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/sobaby/p/1378859.html
Copyright © 2011-2022 走看看