? 简介
在 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