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

Posted Abeam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的系统函数的主要内容,如果未能解决你的问题,请参考以下文章

EF Core Linq-to-Sql GroupBy SelectMany 不适用于 SQL Server

如何使用 LINQ to SQL 连接到 SQL Server?

使用带有 Linq to Sql 的 Sql Server 唯一标识符/更新日期列 - 最佳方法

如何在没有 Linq to SQL 的情况下在 Windows Phone 中使用 SQL Server Compact

从我的 LINQ to SQL 中调用 UDF 和 sproc 的效率如何?

linq to sql 类的使用