11-9. 在LINQ中使用规范函数

问题

想在一个LINQ查询中使用规范函数

解决方案

假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等,如Figure 11-9. 所示:

Figure 11-9. The MovieRental entity that has the dates for a rental period along with any late fees

我们想取得所有租期超过10天的影片

如何创建和使用查询,如Listing 11-16所示:

Listing 11-16. Retrieving the Late Movies using the DateDiff() Function

class Program

{

static void Main(string[] args)

{

RunExample();

}

private static void RunExample()

{

using (var context=new EFRecipesEntities())

{

var mr1 = new MovieRental

{

Title = "A Day in the Life",

RentalDate = DateTime.Parse("2/19/2013"),

ReturnedDate = DateTime.Parse("3/4/2013"),

LateFees = 3M

};

var mr2 = new MovieRental

{

Title = "The Shortest Yard",

RentalDate = DateTime.Parse("3/15/2013"),

ReturnedDate = DateTime.Parse("3/20/2013"),

LateFees = 0M

};

var mr3 = new MovieRental

{

Title = "Jim's Story",

RentalDate = DateTime.Parse("3/2/2013"),

ReturnedDate = DateTime.Parse("3/19/2013"),

LateFees = 3M

};

context.MovieRentals.Add(mr1);

context.MovieRentals.Add(mr2);

context.MovieRentals.Add(mr3);

context.SaveChanges();

}

using (var context = new EFRecipesEntities())

{

Console.WriteLine("Movie rentals late returns");

Console.WriteLine("==========================");

var late = from r in context.MovieRentals

where DbFunctions.DiffDays(r.RentalDate, r.ReturnedDate) > 10

select r;

foreach (var rental in late)

{

Console.WriteLine("{0} was {1} days late, fee: {2}", rental.Title,

(rental.ReturnedDate - rental.RentalDate).Days - 10,

rental.LateFees.ToString("C"));

}

}

}

}

上述Listing 11-16代码输出结果如下:

Movie rentals late returns

==========================

A Day in the Life was 3 days late, fee: $3.00

Jim's Story was 7 days late, fee: $3.00

它是如何工作的?

定义在EF里的规范函数, 它可以不被数据源所知道,而且能被数据提供器支持.规范函数返回的数据类型是根据实体数据模型的类型定义的.

在本小节里,我们使用DiffDays() 函数来计算两个日期的所差的天数,由于DiffDays()是一个规范函数,所以它能被数据所有提供者执行.

最佳实践

你可能会问自己“什么时候应该用实体函数?”. EF提供者把一些表达式翻译成规范函数, 但是这种翻译能力是有限的.不是每个运行时方法都能翻译成相应的规范函数,这里是一些最佳实践,如果可以翻译,那么就使用它,这样能使代码易读.如果不能翻译,那么就明确地使用EntityFunction类来调用规范函数,就像下列的代码片段:

var laterentals = from r in context.MovieRentals

where (r.ReturnedDate - r.RentalDate).Days > 10

select r;

上面这句,不能翻译成规范函数,所以你应该使用下列这句:

var laterentals = from r in context.MovieRentals

where EntityFunctions.DiffDays(r.RentalDate,

r.ReturnedDate) > 10

select r;

附:创建示例用到的数据库的脚本文件

Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition 译 -> 目录 -持续更新

    因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...

  2. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  3. Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪

    9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...

  4. Entity Framework 6 Recipes 2nd Edition(目录索引)

    Chapter01. Getting Started with Entity Framework / 实体框架入门 1-1. A Brief Tour of the Entity Framework ...

  5. Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体

    第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...

  6. Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值

    第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...

  7. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  8. Entity Framework 6 Recipes 2nd Edition(13-2)译 -> 用实体键获取一个单独的实体

    问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...

  9. Entity Framework 6 Recipes 2nd Edition(13-3)译 -> 为一个只读的访问获取实体

    问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...

随机推荐

  1. CoreCRM 开发实录 —— Profile

    再简单的功能,也需要一坨代码的支持.Profile 的编辑功能主要就是修改个人的信息.比如用户名.头像.性别.电话--虽然只是一个编辑界面,但添加下来,涉及了6个文件的修改和7个新创建的文件.各种生成 ...

  2. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. console的高级使用

    1.console.table()用来表格化展示数据. var people = { zqz: { name: 'zhaoqize', age: 'guess?' }, wdx: { name: 'w ...

  4. iOS开发之Alamofire源码深度解析

    今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ...

  5. web api接口同步和异步的问题

    一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...

  6. 在vim中使用查找命令查找指定字符串

    要自当前光标位置向上搜索,请使用以下命令:         /pattern   Enter           其中,pattern   表示要搜索的特定字符序列.         要自当前光标位置 ...

  7. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  8. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  9. SQL 约束

    先用设计器创建约束.再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制见文件Employee.sql非空约束(选择复选框)主键约束(PK) primary key const ...

  10. 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)

    前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...