Ø  简介

在 C# 中比较常用的 ORM(Object Relational Mapping)框架就是 EF 了,EF 经常结合 LINQ to SQL 来操作数据库。本文主要讨论如何在 LINQ to SQL 语法中调用 SQL Server 的内置函数,或者系统函数。主要使用以下静态类实现:

1.   DbFunctions 类

1)   位于 EntityFramework.dll(EF6.0) 程序集的 System.Data.Entity 命名空间中,适用于EF6.0 的版本。

2)   另外,在 EntityFramework.dll(EF6.0) 程序集的 System.Data.Entity.Core.Objects 命名空间中,还有另外一个类 EntityFunctions,但已过时,所以建议使用 DbFunctions 类。非要使用也是可以的,适用于EF6.0 的版本。

2.   SqlFunctions 类

1)   位于 EntityFramework.SqlServer.dll(EF6.0) 程序集的 System.Data.Entity.SqlServer 命名空间中,适用于 EF6.0的版本。

2)   同样,在 System.Data.Entity.dll(.NET v4.5) 程序集的 System.Data.Objects.SqlClient 命名空间中, 也有一个相同的类 EntityFunctions,适用于EF4.0 和 EF5.0 的版本。

3.   SqlMethods 类,该类位于 System.Data.Linq.dll(.NET v4.5) 程序集的 System.Data.Linq.SqlClient 命名空间中。

Ø  注意事项:

1.   如果在调用以上静态方法时,抛出 System.NotSupportedException 异常,例如:LINQ to Entities 不识别方法“System.Nullable`1[System.Int32] CharIndex(System.String, System.String, System.Nullable`1[System.Int32])”,因此该方法无法转换为存储表达式。则表示该类和方法不适用当前的 EF 版本。

1.   DbFunctions 类的使用实例

1)   比较两个 datetime 类型字段是否为同一天(EF6.0)

1.   需求描述

1)   我们都知道在 C# 中需要比较两个日期类型是否为同一天,只需要写这样的代码 dateTime1.Date == dateTime2.Date 就可以了,但是如果在 Linq 中这样去写会报错的,原因是 Linq 不支持 Date 属性。

2)   如果是 SQL,我们可以这样写 CAST(GETDATE() AS date) 来获取日期,但是 Linq 又不提供这种调用转换函数的方法,但是提供了一个 TruncateTime 方法,用于清除时间部分。

2.   具体实现(部分代码)

(System.Data.Entity.DbFunctions.TruncateTime(d7.PayTime) == System.Data.Entity.DbFunctions.TruncateTime(d1.VisitTime))

3.   生成SQL(部分代码)

((convert (datetime2, convert(varchar(255), [Extent18].[PayTime], 102) ,  102)) = (convert (datetime2, convert(varchar(255), [Filter10].[VisitTime], 102) ,  102)))

2.   SqlFunctions 类的使用实例

1)   查询手机号码以 158 开头的学生列表(EF6.0)

1.   需求描述

本示例演示调用 MSSQL 的 CHARINDEX 函数。

2.   具体实现

List<Student> list_2_1 = (from t1 in dbContext.Students

where System.Data.Entity.SqlServer.SqlFunctions.CharIndex("158", t1.MobileNumber, 1) > 0

select t1).ToList();

3.   生成SQL(部分代码)

WHERE ( CAST(CHARINDEX(N'158', [Extent1].[MobileNumber], 1) AS int)) > 0

3.   SqlMethods 类的使用实例

1)   查询邮箱为 QQ 邮箱的学生列表

List<Student> list_3_1 = (from t1 in dbContext.Students

where SqlMethods.Like(t1.Email, "%qq%")

select t1).ToList();

2)   经测试(EF4.0/5.0/6.0),都会以下错误,所以决定暂不研究:

LINQ to Entities 不识别方法“Boolean Like(System.String, System.String)”,因此该方法无法转换为存储表达式。

LINQ to SQL 调用 SQL Server 的系统函数的更多相关文章

  1. mssql sql server 其它系统函数 parsename 点语法字符串分割函数应用简介

    转自:http://www.maomao365.com/?p=4534 一. parsename函数功能简介 parsename函数的主要功能是:可以快速的使用”.”关键字分解字符串,并返回.分解后指 ...

  2. Ubuntu vim+ ctags(包含系统函数) + taglist 配置 分类: vim ubuntu 2015-06-09 18:19 195人阅读 评论(0) 收藏

    阅读大型代码,我们经常需要打开很多的代码文件,搜索各种定义.windows下用惯了ide的朋友,转战Linux的时候可能会觉得很难受,找不到合适的阅读工具.其实万能的vim就可以实现.下面介绍一下vi ...

  3. SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析

    前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度.然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决 ...

  4. SQL Server 2000 系统存储过程

    SQL Server 2000 系统存储过程 在 Microsoft? SQL Server? 中,许多管理和信息活动可以通过系统存储过程执行.系统存储过程按这些分类分组. 分类 描述 Active ...

  5. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  6. SQL Server系统函数:系统信息函数

    原文:SQL Server系统函数:系统信息函数 1.会话id,服务器信息.用户信息 select @@SPID, --返回当前连接的会话ID:SPID @@servername, --SQL Ser ...

  7. SQL Server系统函数:类型转换函数

    原文:SQL Server系统函数:类型转换函数 1.基本的转化 SELECT CAST(2008 as varchar(4)) + ' year!' SELECT CONVERT(varchar(4 ...

  8. Sql Server函数全解(五)之系统函数

     系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...

  9. VS中调用SQL SERVER存储过程

     存储过程是经过编译的,永久保存在数据中的一组SQL语句,通过创建和使用存储过程能够提高程序的重用性和扩展性,为程序提供模块化的功能,还有利于对程序的维护和管理.以下就详谈一下,VB.NET怎样调 ...

随机推荐

  1. c#操作SQL Server入门总结

    我是一名c#新手.本文只是我是常学习的随笔. 一.下载SQL server软件 听说下载开发板是最好的(开发板如果只是用来学习.研究不算是侵权).在安装的时候,我也遇到了很多问题,在公司的电脑安装第一 ...

  2. 爬虫系列二(数据清洗--->正则表达式)

    一 正则常识 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空白字符,等价于 [\t\n\r\f]. \S 匹配任意非空字符 \d 匹配任意数字,等价于 [0-9 ...

  3. Python总结(一)

    从大学开始,就对python有了兴趣,毕业设计就是用python做的一个新闻爬取和关键字提取的程序.然而,毕业之后由于一直没有从事python相关的开发,所以就一直没有再使用,一直停留在偶尔看一些资料 ...

  4. python之函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

  5. Python标准库之ConfigParser模块

    配置文件的格式 a) 配置文件中包含一个或多个 section, 每个 section 有自己的 option: b) section 用 [sect_name] 表示,每个option是一个键值对, ...

  6. IDEA+快捷键

    格式化代码:ctrl+alt+L IDEA快捷键管理:https://blog.csdn.net/h8178/article/details/78328097  (duplicate:为复制上一行)

  7. jsLibrary.js

    以前看犀牛书收藏和组合别人的库. ; (function () { 'use strict'; if (!Date.now) Date.now = function () { return new D ...

  8. .NET IL实现对象深拷贝

    对于深拷贝,通常的方法是将对象进行序列化,然后再反序化成为另一个对象.例如在stackoverflow上有这样的解决办法:https://stackoverflow.com/questions/785 ...

  9. Java 200+ 面试题补充③ Dubbo 模块

    昨天在我的 Java 面试粉丝群里,有一个只有一年开发经验的小伙伴只用了三天时间,就找到了一个年薪 20 万的工作,真是替他感到开心. 他的经历告诉我们:除了加强自我实战经验之外,还要努力积累自己的理 ...

  10. C语言随机点名程序

    #include "stdio.h"#include "stdlib.h"#include "time.h"#include "w ...