【EF Core】EF.Functions
EF.Functions是EF Core提供的函数功能,用于在 LINQ 查询中调用数据库特定的函数,从而生成更高效的 SQL 查询。
using Microsoft.EntityFrameworkCore;
EF.Functions.Like();
EF.Functions.Contains();
EF.Functions.DateDiffDay();
EF.Functions.DateDiffHour();
EF.Functions.DateDiffMinute();
EF.Functions.DateDiffMonth();
EF.Functions.DateDiffSecond();
EF.Functions.DateDiffYear();
EF.Functions.IsDate();
案例
字符串处理
using Microsoft.EntityFrameworkCore;
public void GetUserinfo()
{
_dbContext.UserInfos.Where(c => EF.Functions.Like(c.UserName, "%风%")).ToList();
}
Like 比 Contains、StartsWith、EndsWith 性能更优,直接生成 LIKE 语句
日期计算
// 计算日期差(生成 DATEDIFF)
var orders = dbContext.Orders
.Where(o => EF.Functions.DateDiffDay(o.OrderDate, DateTime.Now) > 30)
.ToList();
支持 DateDiffDay、DateDiffHour、DateDiffMonth 等。
自定义函数扩展
DbFunctionAttribute 是 EF 中的一个特性(Attribute),用于将 .NET 方法映射到数据库函数(如 SQL 函数或存储过程),使其能在LINQ to Entities查询中使用。以下是关键点总结:
1. 核心功能
数据库函数映射:将 CLR 方法标记为数据库函数,使 EF 能将其转换为对应的 SQL 函数调用。
LINQ 集成:标记后的方法可直接在 LINQ 查询中调用,EF 会将其转换为数据库引擎支持的函数。
2. 使用示例
public class MyDbContext : DbContext
{
// 映射到 SQL Server 的 LEN 函数
[DbFunction("LEN", "sqlserver")]
public static int StringLength(string input) => throw new NotSupportedException();
// 在 LINQ 中使用
public void QueryExample()
{
var result = dbContext.Products
.Where(p => StringLength(p.Name) > 5)
.ToList();
}
}
3. 参数说明
函数名:指定数据库中的函数名(如 "LEN")。
命名空间:指定数据库提供程序的命名空间(如 "sqlserver" 或 "System.Data.SqlClient")。
4. 支持场景
内置函数:如 SQL Server 的 SUBSTRING、CONCAT
。
自定义函数:需先在数据库中创建函数,再通过 DbFunctionAttribute 映射。
5. 注意事项
方法实现:标记的方法体通常抛出 NotSupportedException,因实际执行由数据库完成。
数据库兼容性:不同数据库(SQL Server、MySQL 等)的函数语法可能不同,需指定正确的提供程序命名空间。
6. 高级用法
存储过程映射:结合 FromSql 调用存储过程。
聚合函数:如 Count、Avg 等

浙公网安备 33010602011771号