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,它可以批量的添加数据库中的表,视图,或是存储过程和函数。

官方的通知里面提到,此产品在今年底(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。

Entity Framework 5中应用表值函数进行Linq查询的更多相关文章

  1. 在Entity Framework 7中进行数据迁移

    (此文章同时发表在本人微信公众号“dotNET每日精华文章”,欢迎右边二维码来关注.) 题记:虽然EF7重新设计了Entity Framework,不过也还是能够支持数据迁移的. Entity Fra ...

  2. 浅析Entity Framework Core中的并发处理

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core的并发处理方式. 1.常见的并发处 ...

  3. Entity Framework 6 中如何获取 EntityTypeConfiguration 的 Edm 信息?(一)

    1. 案例1 - 类型和表之间的EF代码优先映射 从EF6.1开始,有一种更简单的方法可以做到这一点.有关 详细信息,请参阅我的新EF6.1类型和表格之间的映射. 直接贴代码了 从EF6.1开始,有一 ...

  4. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  5. 使用Entity Framework Core需要注意的一个全表查询问题

    .NET Core 迁移工作如火如荼,今天在使用 Entity Frameowork Core(又名EF Core)时写了下面这样的 LINQ 查询表达式: .Where(u => u.Id = ...

  6. sqlserver中的表值函数和标量值函数

    顾名思义:表值函数返回的是表,而标量值函数可以返回基类型 一.表值函数 用户定义表值函数返回 table 数据类型.对于内联表值函数,没有函数主体:表是单个 SELECT 语句的结果集. 以下示例创建 ...

  7. Entity Framework 5中遇到的 mysql tinyint(1) 转换为 bool 的问题 (我用的是VS2013中的EF5版本)

    数据有一个字段,用的是 tinyint 长度是1  默认值为0 , 当用vs2013中的 EF5来生成 实体模型之后,看到这个列被标识为 bool 类型   Mysql官方参考文档关于布尔类型的说明: ...

  8. SQL Server中使用表值函数

    函数有很多限制,不能使用动态语句,不能使用临时表等等...细看一下,直接写语句就行了,不用动态语句 insert into @re select id,parid,@I from videoclass ...

  9. 如何处理Entity Framework / Entity Framework Core中的DbUpdateConcurrencyException异常(转载)

    1. Concurrency的作用 场景有个修改用户的页面功能,我们有一条数据User, ID是1的这个User的年龄是20, 性别是female(数据库中的原始数据)正确的该User的年龄是25, ...

随机推荐

  1. iOS进阶_地图上定位的标志——大头针

    一.添加大头针 地图使用的框架是MapKit 大头针走的是MKAnnotation协议 /* 注意:因为是满足协议MKAnnotation,所以没有MKAnnotation的系统大头针类,必须自定义大 ...

  2. 织梦cms、帝国cms、PHPcms优缺点解析

    php才是建站的主流,cms这类程序又是用的最多的,占据主流的cms主要就是织梦,帝国,phpcms这三种的,这三个程序都是开源程序.国内用户众多.   一.从美观性来说(以官方默认模版为准   ph ...

  3. test-output目录中找不到testng-fail.xml原因+Reportng+ant build.xml文件

    test-output目录中找不到testng-fail.xml原因: 在没有加入Reportng 报告的相关jar包前,在test-output目录下是有testng-fail.xml,后面加入了R ...

  4. android数据库SQLite的设计模式

    Dao设计模式可能是使用最多的数据库的设计模式其基本思路是将数据库操作的代码 与设计代码分离以便于维护和升级.具体的实现方法是使用包,然后在设计代码中调 用数据库的操作代码,dao设计模式需要创建5个 ...

  5. 使用的组件:Layui

    Layui 经典模块化前端框架 由职业前端倾情打造,面向所有层次的前后端程序猿,中国最容易使用的前端UI解决方案 Layui 出蛋于2016年金秋,是一款带着浓烈情怀的国产前端UI框架,她追求极简,又 ...

  6. Java使用velocity导出word

    效果展示: 使用word编辑好模板

  7. 【Hello CC.NET】自动化发布时 Web.config 文件维护

    在 <[Hello CC.NET]CC.NET 实现自动化集成> 的 HellowWorld 中经实现: 1.获取源码 2.编译项目 3.集成测试 4.Ftp发布项目 5.创建安装包 6. ...

  8. Linux Ubuntu上手动安装.NET Core SDK

    今天重装了一台Linux服务器的Ubuntu 14.04系统,需要重新安装.NET Core 1.0. 按照官网上的文档用apt-get命令进行安装: sudo sh -c 'echo "d ...

  9. UWP?UWP! - Build 2015有些啥?(1)

    UWP?UWP! - Build 2015有些啥? Build 2015圆满落幕了,不知大家有多少人刷夜看了直播呢?不管怎么说,想必各位都很好奇在这场微软开发者盛宴上,Microsoft又发布了什么令 ...

  10. MySQL7:视图

    什么是视图 数据库中的视图是一个虚拟表.视图是从一个或者多个表中导出的表,视图的行为与表非常相似,在视图中用户可以使用SELECT语句查询数据,以及使用INSERT.UPDATE和DELETE修改记录 ...