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中使用规范函数的更多相关文章
-
Entity Framework 6 Recipes 2nd Edition 译 ->; 目录 -持续更新
因为看了<Entity Framework 6 Recipes 2nd Edition>这本书前面8章的翻译,感谢china_fucan. 从第九章开始,我是边看边译的,没有通读,加之英语 ...
-
Entity Framework 6 Recipes 2nd Edition(9-3)译->;找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
-
Entity Framework 6 Recipes 2nd Edition(9-4)译->;Web API 的客户端实现修改跟踪
9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...
-
Entity Framework 6 Recipes 2nd Edition(目录索引)
Chapter01. Getting Started with Entity Framework / 实体框架入门 1-1. A Brief Tour of the Entity Framework ...
-
Entity Framework 6 Recipes 2nd Edition(9-1)译->;用Web Api更新单独分离的实体
第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...
-
Entity Framework 6 Recipes 2nd Edition(11-1)译 ->; 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
-
Entity Framework 6 Recipes 2nd Edition(11-11)译 ->; 在LINQ中调用数据库函数
11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...
-
Entity Framework 6 Recipes 2nd Edition(13-2)译 ->; 用实体键获取一个单独的实体
问题 不管你用DBFirst,ModelFirst或是CodeFirst的方式,你想用实体键获取一个单独的实体.在本例中,我们用CodeFirst的方式. 解决方案 假设你有一个模型表示一个Paint ...
-
Entity Framework 6 Recipes 2nd Edition(13-3)译 ->; 为一个只读的访问获取实体
问题 你想有效地获取只是用来显示不会更新的操作的实体.另外,你想用CodeFirst的方式来实现 解决方案 一个非常常见行为,尤其是网站,就是只是让用户浏览数据.大多数情况下,用户不会更新数据.在这种 ...
随机推荐
-
C# iis 错误配置信息( CS0016: 未能写入输出文件 )
IIS发布时,编译器错误消息: CS0016: 未能写入输出文件 "c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.N ...
-
页面打开自动触发onlick事件
<script type="text/javascript"> // 两秒后模拟点击 setTimeout(function() { // IE if(document ...
-
C语言ASM汇编内嵌语法【转】
转自:http://www.cnblogs.com/latifrons/archive/2009/09/17/1568198.html GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作G ...
-
bzoj2653:middle
思路:首先容易想到二分答案,但如何去check呢,对于一段区间[l,r],把所有小于答案的都赋值为-1,大于等于它的都赋值为1,然后求左端点在[a,b],右端点在[c,d]的最大子串和即可(也就是区间 ...
-
CodeSmith使用总结--创建一个基础模板
问:为什么要用CodeSmith? 答曰:因为我懒的写. Codesmith是一款非常不错的懒人工具,我也经常会用到,因为它在“重复代码”方面能够节省我们很多时间,并且解除了我们重复繁琐并且乏味的“码 ...
-
mysql 结合keepalived测试
vip:192.168.32.66 192.168.32.6 主库: mysql> show variables like '%read_only%'; +------------------+ ...
-
bzoj 4565 状压区间dp
我还以为我状压很好...... 噗!!! 果然我区间很差... f[i][j][s]表示i~j段,合并后的状态为s所得的最大收益 枚举i,j,k,s. f[i][j][s<<1]=max( ...
-
Nginx的配置文件nginx.conf解析
安装openresty的nginx.conf配置文件 0.ng运行的用户和用户组 1.ng进程数,设置为CPU总核心数 2.ng错误日志 3.进程文件,有时ng启动不了,将进程文件删除即可. 4.单进 ...
-
easyui datagrid 弹出页面会出现两个上下滚动条处理办法!
同事推荐将datagrid上加一个toolbar 将上面的工具元素加上就可以了 toolbar: '#divListToolbar',
-
【sql server】索引详解
索引可以理解为一种特殊的目录结构. sql server提供两种索引形式: 聚集索引和非聚集索引. 怎么理解这两种形式. 拿我们常用的字典举例来说, 一个字典好比数据库中的一个表.那么当我们想从字典中 ...