LINQ to SQL 调用 SQL Server 的系统函数

?  简介

在 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)”,因此该方法无法转换为存储表达式。

原文地址:https://www.cnblogs.com/abeam/p/9090005.html

时间: 2024-09-30 10:50:26

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

eclipse编译生成APK如何可以调用平台中的系统函数

我们在使用eclipse开发三方的APK时,有时候可能会遇到这样的问题,有些功能需要调用平台中的系统函数.但是在将应用导出的平台中运行时,会出现权限问题报错,那么我们就需要使用如下的方法,给三方应用签名,使之能够调用平台的系统函数: 1.我们需要去平台系统源码中获取如下两个秘钥文件和签名工具的jar包 签名jar包:out/host/linux-x86/framework/signapk.jar 秘钥文件:build\target\product\security\platform.x509.p

Ubuntu vim+ ctags(包含系统函数) + taglist 配置

阅读大型代码,我们经常需要打开很多的代码文件,搜索各种定义.windows下用惯了ide的朋友,转战Linux的时候可能会觉得很难受,找不到合适的阅读工具.其实万能的vim就可以实现.下面介绍一下vim+ctags+taglist的配置. 安装ctags ubuntu源提供了ctags的安装. sudo apt-get install ctags 安装taglist 下载: http://vim.sourceforge.net/scripts/download_script.php?src_id

SQL Server 2000 系统存储过程

SQL Server 2000 系统存储过程 在 Microsoft? SQL Server? 中,许多管理和信息活动可以通过系统存储过程执行.系统存储过程按这些分类分组. 分类 描述 Active Directory 过程 用于在 Microsoft Windows? 2000 Active Directory? 中注册 SQL Server 实例和 SQL Server 数据库. 目录过程 执行 ODBC 数据字典功能,并隔离 ODBC 应用程序,使之不受基础系统表更改的影响. 游标过程 执

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

前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度.然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决问题过程的一点思索和尝试,如果你有更好的思路和解决方法,也请多多指教. DPA可以监控到该函数每小时被调用的次数,如下截图所示: 那么第一个问题来了. DPA如何监控获取这个函数每小时执行多少次呢? 其实这个很简单, sys.dm_exec_query_stats视图里面有个字段execution_

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

原文:SQL Server系统函数:系统信息函数 1.会话id,服务器信息.用户信息 select @@SPID, --返回当前连接的会话ID:SPID @@servername, --SQL Server实例名称 @@sevicename, --SQL Server版本信息 APP_NAME(), --客户端连接的应用程序名称 HOST_ID(), --客户端连接的进程ID:936 HOST_NAME(), --客户端连接的主机名称:PC0627JVC system_user, --登录名:P

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

原文:SQL Server系统函数:类型转换函数 1.基本的转化 SELECT CAST(2008 as varchar(4)) + ' year!' SELECT CONVERT(varchar(4),2008) + ' year!' 2. 把日期转化为文本 SELECT CONVERT(VARCHAR(30),GETDATE(),120) --年-月-日 时:分:秒(24h) SELECT CONVERT(VARCHAR(10),GETDATE(),120) --年-月-日 时:分:秒(24

(转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法

本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171) at com.microsof

【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

一.From阶段 针对连接说明: 1.笛卡尔积 2.on筛选器 插播:unknown=not unknuwn 缺失的值: 筛选器(on where having)把unknown当做FALSE处理,排除在筛选结果之外.如果比较两个null,结果是不相等的,false check约束中当做true,例如要求某列大于0,当插入null时是成功的,认为null>0是ture.如果比较两个null,结果是相等的,这种比较在unique约束.集合运算(例如union .except).排序.分组,都认为是

PL/SQL调用BIEE WebServices清理BI Server缓存

BIEE自身提供了几种缓存管理的方法,事件表或者是在物理层设置缓存的失效时间,又或者是调用SAPurgeAllCache()过程. 前两种方法都是被动的管理策略(事件表是定时轮询,失效时间是指定有效时长),比较低效:个人更中意主动的缓存管理策略.即一旦数据发生变化就主动清理缓存. 最佳的作法就是在etl结束的时候通过调用API完成缓存的清理,要实现这种方式就需要调用BI Server提供的缓存管理存储过程,BI Server提供如下缓存管理过程: SAPurgeCacheByQuery SAPu