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)”,因此该方法无法转换为存储表达式。
LINQ to SQL 调用 SQL Server 的系统函数的更多相关文章
- mssql sql server 其它系统函数 parsename 点语法字符串分割函数应用简介
转自:http://www.maomao365.com/?p=4534 一. parsename函数功能简介 parsename函数的主要功能是:可以快速的使用”.”关键字分解字符串,并返回.分解后指 ...
- Ubuntu vim+ ctags(包含系统函数) + taglist 配置 分类: vim ubuntu 2015-06-09 18:19 195人阅读 评论(0) 收藏
阅读大型代码,我们经常需要打开很多的代码文件,搜索各种定义.windows下用惯了ide的朋友,转战Linux的时候可能会觉得很难受,找不到合适的阅读工具.其实万能的vim就可以实现.下面介绍一下vi ...
- SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析
前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度.然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决 ...
- SQL Server 2000 系统存储过程
SQL Server 2000 系统存储过程 在 Microsoft? SQL Server? 中,许多管理和信息活动可以通过系统存储过程执行.系统存储过程按这些分类分组. 分类 描述 Active ...
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL Server系统函数:系统信息函数
原文:SQL Server系统函数:系统信息函数 1.会话id,服务器信息.用户信息 select @@SPID, --返回当前连接的会话ID:SPID @@servername, --SQL Ser ...
- SQL Server系统函数:类型转换函数
原文:SQL Server系统函数:类型转换函数 1.基本的转化 SELECT CAST(2008 as varchar(4)) + ' year!' SELECT CONVERT(varchar(4 ...
- Sql Server函数全解(五)之系统函数
系统信息包括当前使用的数据库名称,主机名,系统错误消息以及用户名称等内容.使用SQL SERVER中的系统函数可以在需要的时候获取这些信息.下面介绍系统函数的作用和使用方法. 1.返回表中指定字段的 ...
- VS中调用SQL SERVER存储过程
存储过程是经过编译的,永久保存在数据中的一组SQL语句,通过创建和使用存储过程能够提高程序的重用性和扩展性,为程序提供模块化的功能,还有利于对程序的维护和管理.以下就详谈一下,VB.NET怎样调 ...
随机推荐
- 【Python 13】分形树绘制1.0--五角星(turtle库)
1.案例描述 2.案例分析 引入绘制图形的turtle库,利用库中函数进行编程. 3.turtle库 没有显示的input()和output(),没有赋值语句.调用形式大部分如下: import tu ...
- KafkaManager编译安装使用(支持kerberos认证)
为了能够方便的查看及管理Kafka集群,yahoo提供了一个基于Web的管理工具(Kafka-Manager). 这个工具可以方便的查看集群中Kafka的Topic的状态(分区.副本及消息量等),支持 ...
- 监控glusterfs
监控集群状态 [4ajr@elk1 scripts]$ cat glusterfs_peer_status.sh #!/bin/bash peer_status=`sudo gluster peer ...
- richedit缩放
本程序下载地址: 要使文本在richedit控件上进行放大缩小,可以通过设置字体的大小,从而来达到缩放文本的目的. 下面是一个例子:通过调整滚动条,从而控制richedit文本缩放. 程序运行结果如下 ...
- LightGBM大战XGBoost,谁将夺得桂冠?
引 言 如果你是一个机器学习社区的活跃成员,你一定知道 提升机器(Boosting Machine)以及它们的能力.提升机器从AdaBoost发展到目前最流行的XGBoost.XGBoost实际上已经 ...
- Java基础:Java变量、数据类型、运算符(2)
1. 标识符和关键字 1.1 标识符 标识符是用来标识类名.对象名.变量名.方法名.类型名.数组名.文件名的有效序列. Java规定,标识符由字母.数字.下划线“_”.美元符号“$”组成,并且首字母不 ...
- EntityManagerFactory 是多线程的 将其变成一个单线程(使用静态方法)提交效率
由于EntityManagerFactory 是一个线程安全的对象(即多个线程访问同一个EntityManagerFactory 对象不会有线程安全问题),并且EntityManagerFactory ...
- UVA 10618 Tango Tango Insurrection
https://vjudge.net/problem/UVA-10618 题目 你想学着玩跳舞机.跳舞机的踏板上有4个箭头:上.下.左.右.当舞曲开始时,屏幕上会有一些箭头往上移动.当向上移动箭头与顶 ...
- windows下使用hbase/opencv/ffmpeg小记
1.hadoop安装 不同于Ubuntu,win 10下使用hbase需安装hadoop环境,这里有几个坑,首先14年以后,hadoop已不再发布window版本,这里可往官网 http://hado ...
- [FJOI2016]建筑师
题目描述 小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 n 个建筑,每个建筑的高度是 1 到 n 之间的一个整数. 小 Z 有很严重的强迫症,他不喜欢有两个建筑的高度相同. ...