猿教程 Logo

Entity Framework 表值函数

Entity Framework 5.0支持SQL Server的表值函数。

表值函数类似于存储过程,其中一个主要区别是:TVF的结果是可组合的,这意味着它可以在LINQ查询中使用。

我们在数据库中创建了一个TVF GetCourseListByStudentID,它将返回特定学生的所有课程。 例如:

 USE [SchoolDB]
    GO
    /****** Object:  UserDefinedFunction [dbo].[GetCourseListByStudentID]  */  
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE FUNCTION [dbo].[GetCourseListByStudentID]
    (    
        -- Add the parameters for the function here
        @studentID int
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
        -- Add the SELECT statement with parameter references here
        select c.courseid, c.coursename,c.Location, c.TeacherId
    from student s left outer join studentcourse sc on sc.studentid = s.studentid left outer join course c on c.courseid = sc.courseid
    where s.studentid = @studentID
    )

现在,更新您的EDM,并将此TVF添加到您的EDM。 右键单击设计器→从数据库中选择更新模型。


展开存储过程和函数节点→展开模式节点(在我们的案例中为dbo模式)→选择“GetCourseListByStudentID”,然后单击完成。 确保选中“将选定的过程和函数导入实体模型”复选框(这将自动导入函数)。


导入函数后,可以验证它:打开模型浏览器→展开函数导入→右键单击导入的函数'GetCourseListByStudentID'→点击编辑:


您可以看到EDM已自动创建复杂类型GetCourseListByStudentID_Result作为返回集合类型。


如果TVF返回与实体相同的列,也可以选择现有实体作为返回类型:


现在,您可以使用TVF与DBContext。 例如:

using (var ctx = new SchoolDBEntities())
        {
    //Execute TVF and filter result
            var courseList = ctx.GetCourseListByStudentID(1).Where(c => c.Location.SpatialEquals(DbGeography.FromText("POINT(-122.360 47.656)"))))
                            .ToList<GetCourseListByStudentID_Result>();
               
            foreach (GetCourseListByStudentID_Result cs in courseList)
                Console.WriteLine("Course Name: {0}, Course Location: {1}", 
                            cs.CourseName, cs.Location);
    }


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/table-valued-function-in-entity-framework5.html