11-11. 在LINQ中调用数据库函数

问题

相要在一个LINQ 查询中调用数据库函数.

解决方案

假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查询某周给定的一天里的所有appointment.

Figure 11-11. An Appointment entity with the start and end times for appointments

如果我们想要找出所有周四的appointment, 我们不能在where子句里,使用运行时枚举DayOfWeek.Thursday与StartsAt属性比较,因为这样是不能翻译成数据库语句.

我们需要像下列的Listing 11-18这样操作:

Listing 11-18. Using a Database Function in a LINQ Query

class Program

{

static void Main(string[] args)

{

RunExample();

}

static void RunExample()

{

using (var context = new EFRecipesEntities())

{

var app1 = new Appointment

{

StartsAt = DateTime.Parse("7/23/2013 14:00"),

GoesTo = DateTime.Parse("7/23/2013 15:00")

};

var app2 = new Appointment

{

StartsAt = DateTime.Parse("7/24/2013 9:00"),

GoesTo = DateTime.Parse("7/24/2013 11:00")

};

var app3 = new Appointment

{

StartsAt = DateTime.Parse("7/24/2013 13:00"),

GoesTo = DateTime.Parse("7/23/2013 15:00")

};

context.Appointments.Add(app1);

context.Appointments.Add(app2);

context.Appointments.Add(app3);

context.SaveChanges();

}

using (var context = new EFRecipesEntities())

{

var apps = from a in context.Appointments

where SqlFunctions.DatePart("WEEKDAY", a.StartsAt) == 4

select a;

Console.WriteLine("Appointments for Thursday");

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

foreach (var appointment in apps)

{

Console.WriteLine("Appointment from {0} to {1}",

appointment.StartsAt.ToShortTimeString(),

appointment.GoesTo.ToShortTimeString());

}

}

}

}

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

Appointments for Thursday

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

Appointment from 9:00 AM to 11:00 AM

Appointment from 1:00 PM to 3:00 PM

它是如何工作的?

数据库函数可用于eSQL 和LINQ 查询中. 这些函数通过

SqlFunctions 类里的方法发布出来.由于这些函数运行在数据库端, 所以它的表现方式可能与你在.net端想的表现方式会有所不同,例如周四,在.NET里 DayOfWeek.Thursday 的值是4.而在数据库, 它是第5天,所以它的值是5.

与数据库函数在eSQL中使用一样,不是所有的数据库函数都被LINQ查询支持,可以从微软的文档中查看所有支持的函数列表.

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

Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在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(13-2)译 -> 用实体键获取一个单独的实体

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

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

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

  8. Entity Framework 6 Recipes 2nd Edition(13-4)译 -> 有效地创建一个搜索查询

    问题 你想用LINQ写一个搜索查询,能被转换成更有效率的SQL.另外,你想用EF的CodeFirst方式实现. 解决方案 假设你有如下Figure 13-6所示的模型 Figure 13-6. A s ...

  9. Entity Framework 6 Recipes 2nd Edition(13-5)译 -> 使POCO的修改追踪更高

    问题 你正在使用POCO,你想提高修改跟踪的性能,同时使内存消耗更少.另外,你想通过EF的CodeFirst方式来实现. 解决方案 假设你有一个关于Account(帐户)和相关的Payments(支付 ...

随机推荐

  1. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  2. Android探索之AIDL实现进程间通信

    前言: 前面总结了程序间共享数据,可以使用ContentProvider也可以使用SharedPreference,那么进程间怎么共享内存呢?Android系统中的进程之间不能共享内存,因此,需要提供 ...

  3. geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

    目录 前言 实现过程 总结 一.前言        上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...

  4. Mysql存储引擎比较

    Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...

  5. PHP之Memcache缓存详解

         Mem:memory缩写(内存):内存缓存 1.  断电或者重启服务器内存数据即消失,即临时数据: Memcache默认端口:11211 存入方式:key=>>value    ...

  6. FFmpeg + SoundTouch实现音频的变调变速

    本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件. 主要有以下内容: 实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息 将解 ...

  7. 【Java每日一题】20170103

    20161230问题解析请点击今日问题下方的"[Java每日一题]20170103"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...

  8. 负载均衡——nginx理论

     nginx是什么? nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡.具有高性能.轻量级.内存消耗少,强大的负载均衡能力等优势.  nginx架构? ...

  9. iOS--->微信支付小结

    iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...

  10. JavaScript 写计算器改进版

    <html><head><style> .short{height:50px;width:55px;float:left;}</style></h ...