zoukankan      html  css  js  c++  java
  • Entity Framework 5中应用表值函数进行Linq查询

    Entity Framework 5引入了表值函数(Table-Valued Functions TVFs)。表值函数的返回类型是一个Table类型,可用在SQL查询语句中。最简单的表值函数,读取客户表的记录,参考如下代码:

    CREATE FUNCTION  GetCustomers
    return table
    AS
    
    return (  SELECT  *   FROM Customer) ;
    
     

    此外,表值函数还可以指定要返回的表的列名和函数参数,请参考下面的代码例子:

     
    CREATE FUNCTION  GetCustomer(@customerNo nvarchar(50))
    
    returns table 
    
    AS
    
    RETURN (  select * from  customer where customerNo=@customerNo );
    

    Entity Framework 5的Target是.NET 4.5,所以只有选择Visual Studio 2012才可以编译代码。

    打开SQL Server Management Studio,运行下面的SQL表值函数:

    CREATE FUNCTION [dbo].[GetStudentGradesForCourse]
     (@CourseID INT)
     RETURNS TABLE
     RETURN
        SELECT [EnrollmentID],
               [CourseID],
               [StudentID],
               [Grade]
        FROM   [dbo].[StudentGrade]
        WHERE  CourseID = @CourseID
    

    启动Visual Studio 2012,增加一个新项目,添加ADO.NET Entity Data Model。在选择模型内容对话框中,选择从数据库中产生,点击下一步,创建一个新的数据库连接。

    在选择数据库对象窗口中,选择存储过程和函数节点,选取它下面的子节点GetStudentGradesForCourse函数,点击完成。

    默认的,存储过程和函数的返回值会自动生成一个新复合类型,但是,我们需要的是让它返回一个StudentGrade对象,如上面的函数脚本所表达的。为达到此目的,在模型浏览器窗口中,选择导入的函数,双击GetStudentGradesForCourse函数,在编辑导入的函数对话框中,选择实体,然后选择StudentGrade类型。

    在.NET代码中,请参考下面的Linq查询,它会调用表值函数,然后投影到一个新的匿名类型中,代码如下所示

    using (var context = new SchoolEntities())
    {
        var CourseID = 4022;
        var Grade = 3.5M;
        
        // Return all the best students in the Microeconomics class.
        var students = from s in context.GetStudentGradesForCourse(CourseID)
                                where s.Grade >= Grade
                                select new
                                {
                                    s.Person,
                                    s.Course.Title
                                };
     
        foreach (var result in students)
        {
            Console.WriteLine(
                "Couse: {0}, Student: {1} {2}",
                result.Title, 
                result.Person.FirstName, 
                result.Person.LastName);
        }
    }
    

    Entity Framework中,需要手动拖动object(table,function,stored procedure)到实体设计器中,这样会有些不方便。如果想一次性把所选择的object都添加的实体设计器中,可以参考如下的方法。

    应用工具 Huagati DBML/EDMX,它可以批量的添加数据库中的表,视图,或是存储过程和函数。

    image

    官方的通知里面提到,此产品在今年底(2013.12.31)将停止开发(discontinue)。微软的构建的生态系统既垄断了框架开发的内容,还占据了开发工具领域,第三方的小工具生存的机率是很不容易。

    除了微软自己的实体设计器,还有些第三方的实体设计工具,在这里做一个简单介绍。

    Devart 的 Entity Designer,地址是 http://www.devart.com/entitydeveloper/,主要特性是支持模型优先和数据库优先的二种开发模式,而且支持框架NHibernate,ADO.NET Entity Framework,LinqConnect,Linq to SQL。

    Solution Design的LLBL Gen Pro,地址是http://www.llblgen.com 

    3.x的版本才引入的多框架支持,对其它的框架支持可能仅仅是个卖点,它自身框架的(LLBL Gen Pro Framework)已经非常成熟稳定。

    LLBL Gen是一个支持多框架的实体设计工具,如NHibernate,Entity Framework,LLBL Gen Pro Framework。

  • 相关阅读:
    190. Reverse Bits
    150. Evaluate Reverse Polish Notation
    【UML】状态图与活动图
    【UML】类图与对象图
    【UML】用例图
    【运维】Dell R710如何开启VT服务
    【运维】Dell R710如何做Raid0与Raid5
    【运维】略谈Raid级别
    【VMware vSphere】VMware vSphere简单了解
    【Linux】在Linux上安装VNC
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/3331020.html
Copyright © 2011-2022 走看看