【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 比 ContainsStartsWithEndsWith 性能更优,直接生成 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 等

posted @ 2022-05-18 21:08  .Neterr  阅读(1007)  评论(0)    收藏  举报