zoukankan      html  css  js  c++  java
  • 再接再厉VS 2008 sp1 + .NET 3.5 sp1(6) Entity Framework(实体框架)之Entity SQL

    [索引页]
    [源码下载]


    再接再厉VS 2008 sp1 + .NET 3.5 sp1(6) - Entity Framework(实体框架)之Entity SQL


    作者:webabcd


    介绍
    以Northwind为示例数据库,ADO.NET Entity Framework之详解Entity SQL
    • Linq 方法上也可以使用 esql
    • 查询表达式
      • select, from, where, order by, group by, having
      • cross join, inner join, left outer join, right outer join, full outer join
      • case when then else end
    • 集合运算符
      • anyelement(expression) - 从集合中提取任意元素
      • except - 从左侧表达式的结果中删除其与右侧表达式结果中的相同项,并返回此结果
      • flatten(collection) - 将多个集合组成的集合转换为一个集合
      • intersect - 返回运算符两侧查询结果的相同项
      • [not] exists(expression) - 确定查询结果是否存在
      • [not] in {,} - 确定某值是否在某集合中
      • overlaps - 确定运算符两侧查询结果是否具有相同项
      • set(expression) - 移除重复项
      • union - 将运算符两侧查询结果连接成一个集合(移除重复项)
      • union all - 将运算符两侧查询结果连接成一个集合(包括重复项)
      • top(n) - 取前 n 条记录
    • 分页运算符
      • skip n - 需要跳过的项数,结合 order by 使用
      • limit n - 需要选择的项数,结合 order by 使用
    • 类型运算符
      • cast(expression as data_type) - 将表达式转换为另一种数据类型(使用 EntityCommand 执行查询,返回 EDM 类型;使用 ObjectQuery 执行查询,返回 CLR 类型)
      • oftype - 从查询表达式返回指定类型的对象集合,需 EDM 中继承关系的支持
      • is of - 确定表达式的类型是否为指定类型或指定类型的某个子类型,需 EDM 中继承关系的支持
      • treat - 将指定基类型的对象视为指定派生类型的对象,需 EDM 中继承关系的支持
    • 常用运算符
      • 算术运算符
        • +
        • -(减或负)
        • *
        • /
        • %
      • 比效运算符
        • >, >=, <, <=, <>, !=
        • is null, is not null
        • between and, not between and
        • like, not like
      • 通配符(应用于 like 和 not like)
        • % - 零个或零个以上的任意字符
        • _ - 任意单个字符
        • [] - 在指定范围 [a-f] 或集合 [abcdef] 中的任意单个字符
        • [^] - 不在指定范围 [^a-f] 或集合 [^abcdef] 中的任意单个字符
      • 逻辑运算符
        • and, &&
        • or, ||
        • not, !
      • 其他字符
        • -- - 注释
        • . - 成员访问
        • ; - 分行
        • + - 串联字符串
    • 函数
      • 函数 - 聚合函数
        • Avg(expression) - 非 null 的平均值
        • Count(expression) - 记录总数(Int64)
        • BigCount(expression) - 记录总数(Int32)
        • Max(expression) - 非 null 的最大值
        • Min(expression) - 非 null 的最小值
        • Sum(expression) - 非 null 的总和值
        • StDev(expression) - 非 null 的标准偏差值(相对于平均值的标准偏差)
      • 函数 - 数学函数
        • Abs(value) - 取绝对值
        • Ceiling(value) - 取不小于参数的最小整数
        • Floor(value) - 取不大于参数的最大整数
        • Round(value) - 取参数的整数部分
      • 函数 - 字符串函数
        • Left(string, length) - 从左侧开始,取 string 的前 length 个字符
        • Right( tring, length) - 从右侧开始,取 string 的前 length 个字符
        • LTrim(string) - 去掉 string 的左侧的空白
        • RTrim(string) - 去掉 string 的右侧的空白
        • Trim(string) - 去掉 string 的两侧的空白
        • ToLower(string) - 将 string 全部转换为小写
        • ToUpper(string) - 将 string 全部转换为大写
        • Concat(string1, string2) - 串联 string1 和 string2
        • Replace(string1, string2, string3) - 将 string1 中的所有 string2 都替换为 string3
        • Reverse(string) - 取 string 的反序
        • Substring(string, start, length) - 从 string 的 start 位置开始取 length 个字符,索引从 1 开始
        • IndexOf(string1, string2) - string1 在 string2 中的位置,索引从 1 开始,若找不到则返回 0
      • 函数 - 日期和时间函数
        • Year(expression) - 取时间的年的部分
        • Month(expression) - 取时间的月的部分
        • Day(expression) - 取时间的日的部分
        • Hour(expression) - 取时间的时的部分
        • Minute(expression) - 取时间的分的部分
        • Second(expression) - 取时间的秒的部分
        • Millisecond(expression) - 取时间的毫秒的部分(0 - 999)
        • CurrentDateTime() - 取服务器的当前时间
        • CurrentUtcDateTime() - 取服务器的 UTC 当前时间
        • CurrentDateTimeOffset() - 返回值类型为 DateTimeOffset , 取当前时间及相对于 UTC 时间的差值
      • 函数 - 按 位 运算的函数
        • BitWiseAnd(value1, value2) - 取 value1 和 value2 的位与结果
        • BitWiseOr(value1, value2) - 取 value1 和 value2 的位或结果
        • BitWiseXor(value1, value2) - 取 value1 和 value2 的位异或结果
        • BitWiseNot(value) - 取 value 的位求反结果
      • 函数 - 其它函数
        • NewGuid() - 返回新生成的 GUID
    • 不常用运算符
      • row, multiset, createref, deref, key, ref, navigate


    示例
    EntitySQL.aspx.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    using System.Data.Common;

    using VS2008SP1.Business;

    public partial class EntityFramework_EntitySQL : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {
            
    if (!Page.IsPostBack)
            
    {
                
    // esql 概述
                Demo();

                
    // 在 Linq 方法上使用 esql
                Demo2();

                
    // esql 查询表达式的 demo
                Demo3();

                
    // 集合运算符的 Demo
                Demo4();

                
    // 分页运算符的 Demo
                Demo5();
            }

        }


        
    /// <summary>
        
    /// esql 概述
        
    /// </summary>

        void Demo()
        
    {
            
    using (var ctx = new NorthwindEntities())
            
    {
                
    // 下面 esql 中的 NorthwindEntities 为 EntityContainer 的名称
                
    // [] - 遇到特殊的段名称时(如汉字),用此括起来
                string esql = "select c.[CategoryId], c.[CategoryName] from NorthwindEntities.Categories as c";

                ObjectQuery
    <DbDataRecord> query = ctx.CreateQuery<DbDataRecord>(esql);

                
    // it - ObjectQuery<T> 的默认名称
                
    // query.Where("it.CategoryId=1").Execute(MergeOption.NoTracking);

                
    // Name - 可以修改 ObjectQuery<T> 的名称,以后再引用该 ObjectQuery<T> 时则使用此名称
                query.Name = "cate";
                
    // 可以在 Linq 方法上使用 esql,后跟任意个 ObjectParameter 类型的参数
                query = query.Where("cate.CategoryId=@CategoryId"new ObjectParameter("CategoryId"1));

                
    /*
                exec sp_executesql N'SELECT 
                1 AS [C1], 
                [Extent1].[CategoryID] AS [CategoryID], 
                [Extent1].[CategoryName] AS [CategoryName]
                FROM [dbo].[Categories] AS [Extent1]
                WHERE [Extent1].[CategoryID] = @CategoryId',N'@CategoryId int',@CategoryId=1 
                
    */

            }


            
    using (var ctx = new NorthwindEntities())
            
    {
                
    // value - 后面只能跟一个成员
                string esql = "select value c.CategoryId from Categories as c where c.CategoryId=@CategoryId or c.CategoryId=@CategoryId2";

                ObjectParameter op 
    = new ObjectParameter("CategoryId"1);
                ObjectParameter op2 
    = new ObjectParameter("CategoryId2"2);

                
    // 配置 esql 的参数的方法
                ObjectQuery<DbDataRecord> query = ctx.CreateQuery<DbDataRecord>(esql, op);
                query.Parameters.Add(op2);

                
    /*
                exec sp_executesql N'SELECT 
                [Extent1].[CategoryID] AS [CategoryID]
                FROM [dbo].[Categories] AS [Extent1]
                WHERE ([Extent1].[CategoryID] = @CategoryId) OR ([Extent1].[CategoryID] = @CategoryId2)',N'@CategoryId int,@CategoryId2 int',@CategoryId=1,@CategoryId2=2 
                
    */

            }


            
    using (var ctx = new NorthwindEntities())
            
    {
                
    // 使用 SqlServer 命名空间,以使用 SqlServer 的 LEN 函数为例
                string esql = "using SqlServer;select LEN(p.ProductName) as PriceCount from Products as p";
                
    // string esql = "select SqlServer.LEN(p.ProductName) as PriceCount from Products as p";

                
    /*
                SELECT 
                1 AS [C1], 
                LEN([Extent1].[ProductName]) AS [C2]
                FROM [dbo].[Products] AS [Extent1] 
                
    */



                
    // 使用 System 命名空间,以使用 .NET(CLR) 的 String 类型为例
                esql = "select value cast(c.CategoryId as System.String) from Categories as c";
                
    // esql = "using System;select value cast(c.CategoryId as String) from Categories as c";

                
    /*
                SELECT 
                CAST( [Extent1].[CategoryID] AS nvarchar(max)) AS [C1]
                FROM [dbo].[Categories] AS [Extent1]
                
    */

            }

        }


        
    /// <summary>
        
    /// 在 Linq 方法上使用 esql
        
    /// </summary>

        void Demo2()
        
    {
            
    using (var ctx = new NorthwindEntities())
            
    {
                var 
    where = ctx.Categories.Where("it.CategoryId = 1");
                var orderby 
    = ctx.Categories.OrderBy("it.CategoryId desc");
                var select 
    = ctx.Categories.Select("it.CategoryId as ID");
                var selectvalue 
    = ctx.Categories.SelectValue<string>("cast(it.CategoryId as System.String) + '_' + it.CategoryName");
                var top 
    = ctx.Categories.Top("3");
                var skip 
    = ctx.Categories.Skip("it.CategoryId desc""3");
                var groupby 
    = ctx.Products.GroupBy("it.Categories.CategoryId""it.Categories.CategoryId, count(1)");

                
    // 相当于在 Categories 上 Load 进来 Products
                ctx.Categories.Include("it.Products");
            }

        }


        
    /// <summary>
        
    /// esql 查询表达式的 demo
        
    /// </summary>

        void Demo3()
        
    {
            
    string esql =
               
    @"select 
                    it.Categories.CategoryId, Count(1) as ProductCount
                  from 
                    Products as it 
                  group by 
                    it.Categories.CategoryId 
                  having 
                    count(1) > 10
                  order by 
                    it.Categories.CategoryId desc 
    ";
            
    /* 
            注:其中 [C2] 会自动被映射到 ProductCount
            SELECT 
            [Project1].[C2] AS [C1], 
            [Project1].[CategoryID] AS [CategoryID], 
            [Project1].[C1] AS [C2]
            FROM ( SELECT 
                [GroupBy1].[A2] AS [C1], 
                [GroupBy1].[K1] AS [CategoryID], 
                1 AS [C2]
                FROM ( SELECT 
                    [Extent2].[CategoryID] AS [K1], 
                    COUNT(1) AS [A1], 
                    COUNT(1) AS [A2]
                    FROM  [dbo].[Products] AS [Extent1]
                    LEFT OUTER JOIN [dbo].[Categories] AS [Extent2] ON [Extent1].[CategoryID] = [Extent2].[CategoryID]
                    GROUP BY [Extent2].[CategoryID]
                )  AS [GroupBy1]
                WHERE [GroupBy1].[A1] > 10
            )  AS [Project1]
            ORDER BY [Project1].[CategoryID] DESC 
            
    */



            
    string esql2 =
                
    @"select 
                    p.ProductName, c.CategoryName
                  from 
                    Products as p
                  inner join
                    Categories as c
                  on 
                    p.Categories.CategoryId = c.CategoryId
    ";
            
    /*
            SELECT 
            1 AS [C1], 
            [Extent1].[ProductName] AS [ProductName], 
            [Extent2].[CategoryName] AS [CategoryName]
            FROM  [dbo].[Products] AS [Extent1]
            INNER JOIN [dbo].[Categories] AS [Extent2] ON  EXISTS (SELECT 
                cast(1 as bit) AS [C1]
                FROM   ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]
                INNER JOIN [dbo].[Categories] AS [Extent3] ON 1 = 1
                WHERE ([Extent1].[CategoryID] = [Extent3].[CategoryID]) AND ([Extent3].[CategoryID] = [Extent2].[CategoryID])
            ) 
            
    */



            
    string esql3 =
                
    @"select 
                    p.ProductId, 
                    (
                      case 
                        when p.ProductId < 10 then '小于10的ID'
                        when p.ProductId < 20 then '小于20大于等于10的ID'
                        else '大于等于20的ID'
                      end
                    ) as Comment
                  from Products as p
    ";
            
    /*
            SELECT 
            1 AS [C1], 
            [Extent1].[ProductID] AS [ProductID], 
            CASE WHEN ([Extent1].[ProductID] < 10) THEN '小于10的ID' WHEN ([Extent1].[ProductID] < 20) THEN '小于20大于等于10的ID' ELSE '大于等于20的ID' END AS [C2]
            FROM [dbo].[Products] AS [Extent1] 
            
    */

        }


        
    /// <summary>
        
    /// 集合运算符的 Demo
        
    /// </summary>

        void Demo4()
        
    {
            
    using (var ctx = new NorthwindEntities())
            
    {
                
    string esql = "flatten(select value c.Products from NorthwindEntities.Categories as c)";
                
    /*
                SELECT 
                [Extent1].[Discontinued] AS [Discontinued], 
                [Extent1].[ProductID] AS [ProductID], 
                [Extent1].[ProductName] AS [ProductName], 
                [Extent1].[QuantityPerUnit] AS [QuantityPerUnit], 
                [Extent1].[ReorderLevel] AS [ReorderLevel], 
                [Extent1].[UnitPrice] AS [UnitPrice], 
                [Extent1].[UnitsInStock] AS [UnitsInStock], 
                [Extent1].[UnitsOnOrder] AS [UnitsOnOrder]
                FROM [dbo].[Products] AS [Extent1]
                WHERE [Extent1].[CategoryID] IS NOT NULL
                
    */



                
    string esql2 = "select p.ProductId from Products as p where p.ProductId in {1,2,3}";
                
    /*
                SELECT 
                1 AS [C1], 
                [Extent1].[ProductID] AS [ProductID]
                FROM [dbo].[Products] AS [Extent1]
                WHERE ([Extent1].[ProductID] = 1) OR ([Extent1].[ProductID] = 2) OR ([Extent1].[ProductID] = 3) 
                
    */



                
    string esql3 = "anyelement(select value c from NorthwindEntities.Categories as c)";
                
    /*
                SELECT 
                [Element1].[CategoryID] AS [CategoryID], 
                [Element1].[CategoryName] AS [CategoryName], 
                [Element1].[Description] AS [Description], 
                [Element1].[Picture] AS [Picture]
                FROM   ( SELECT cast(1 as bit) AS X ) AS [SingleRowTable1]
                LEFT OUTER JOIN  (SELECT TOP (1) 
                    [Extent1].[CategoryID] AS [CategoryID], 
                    [Extent1].[CategoryName] AS [CategoryName], 
                    [Extent1].[Description] AS [Description], 
                    [Extent1].[Picture] AS [Picture]
                    FROM [dbo].[Categories] AS [Extent1] ) AS [Element1] ON 1 = 1
                
    */

            }

        }


        
    /// <summary>
        
    /// 分页运算符的 Demo
        
    /// </summary>

        void Demo5()
        
    {
            
    string esql =
                
    @"select p.ProductId from Products as p 
                  order by p.ProductId skip 10 limit 3
    ";
            
    /*
            SELECT TOP (3) 
            [Project1].[C1] AS [C1], 
            [Project1].[ProductID] AS [ProductID]
            FROM ( SELECT [Project1].[ProductID] AS [ProductID], [Project1].[C1] AS [C1], row_number() OVER (ORDER BY [Project1].[ProductID] ASC) AS [row_number]
                FROM ( SELECT 
                    [Extent1].[ProductID] AS [ProductID], 
                    1 AS [C1]
                    FROM [dbo].[Products] AS [Extent1]
                )  AS [Project1]
            )  AS [Project1]
            WHERE [Project1].[row_number] > 10
            ORDER BY [Project1].[ProductID] ASC
            
    */

        }

    }



    OK
    [源码下载]
  • 相关阅读:
    rqnoj PID95:多多看DVD(加强版)
    洛谷1309:瑞士轮
    codevs 1052:地鼠游戏
    noi openjudge7627:鸡蛋的硬度
    codevs 1039:数的划分
    lesson 20 pioneer pilots
    TPO-10 C2 Return a literature book
    lesson 19 A very dear cat
    word record 01
    lesson 18 Electric currents in modern art
  • 原文地址:https://www.cnblogs.com/webabcd/p/1388753.html
Copyright © 2011-2022 走看看