.net 首先在实体框架中使用代码的TVF(表值函数)

.net 首先在实体框架中使用代码的TVF(表值函数),.net,sql-server,entity-framework,ef-code-first,user-defined-functions,.net,Sql Server,Entity Framework,Ef Code First,User Defined Functions,有人知道是否可以先使用代码在实体框架中使用TVFs吗?具体而言: 我知道代码优先目前不支持这一点(而且看起来EF6也不允许)。另一方面,EF的更高版本在数据库优先的场景中支持TVFs(这对我来说不是一个选项)。我想知道是否有人知道是否有某种方法可以通过操纵模型或类似的东西来模拟数据库首先做的事情 进一步澄清;我知道可以使用SQL包含TVFs,但我还需要TVFs是可组合的(即,是实体LINQ语句的一部分)。您可以在实体框架5中使用表值函数。。我认为这将解决您的问题: 要在实体框架中使用表值函数,需

有人知道是否可以先使用代码在实体框架中使用TVFs吗?具体而言:

我知道代码优先目前不支持这一点(而且看起来EF6也不允许)。另一方面,EF的更高版本在数据库优先的场景中支持TVFs(这对我来说不是一个选项)。我想知道是否有人知道是否有某种方法可以通过操纵模型或类似的东西来模拟数据库首先做的事情


进一步澄清;我知道可以使用SQL包含TVFs,但我还需要TVFs是可组合的(即,是实体LINQ语句的一部分)。

您可以在实体框架5中使用
表值函数。
。我认为这将解决您的问题:

要在实体框架中使用表值函数,需要执行以下步骤:

1。在解决方案资源管理器中右键单击项目名称,指向“添加”,然后单击“新建”
项目

2.从左侧菜单中选择数据,然后在菜单中选择ADO.NET实体数据模型 模板窗格

3.输入文件名
TVFModel.edmx
,然后单击添加

4.在“选择模型内容”对话框中,选择“从数据库生成”,然后单击 单击下一步

5.单击新建连接 在服务器名称文本框中输入
(localdb)\v11.0
输入School作为数据库名称 单击“确定”

6.在“选择数据库对象”对话框的“表”节点下,选择
人员、学生成绩和课程表

7.选择存储过程下的
GetStudentGradesForCourse
函数 和功能节点注意,从Visual Studio 2012开始,实体设计器
允许您批量导入存储过程和函数

8.单击完成

9.为编辑模型提供设计图面的实体设计器是
显示。在“选择数据库对象”对话框中选择的所有对象
对话框添加到模型中

10。默认情况下,每个导入的存储过程或函数的结果形状将
自动成为实体模型中的新复杂类型。但我们想要地图
GetStudentGradesForCourse
函数的结果将传递给StudentGrade实体: 在设计图面上单击鼠标右键,然后选择“模型浏览器” 在模型浏览器中,选择函数导入,然后双击
GetStudentGradesForCourse
函数 在“编辑函数导入”对话框中,选择实体并选择StudentGrade

您可以使用以下代码在应用程序中使用
表值函数
,以检索数据:

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);
    }
}

这是目前不可能的。它被推迟到EF6之后。最好的办法是在他们的用户语音板上投票支持它。功能建议的标题为“”。我刚刚投了3票赞成。这现在是可能的。我创建了一个自定义模型约定,允许在EF6.1中的CodeFirst中使用存储函数。该公约可在NuGet上获得。以下是包含所有详细信息的博客帖子链接:

Vaibhav,他询问的是“代码优先支持”。edmx文件是“数据库优先”的。在EF6中,一个非常粗糙的解决方法是使用拦截器将实体的表名重写为TVF调用。我做了一个决定。不推荐!在EF6.1和我创建的自定义约定中,这一点现在可以复制。看看我下面的答案。现在有可能了——看看我的答案。棒极了的工作爪!今天早些时候我读了你的博客。我期待着下一次尝试删除edmx文件时尝试一下。