You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EF Core查询条件中使用EF.Functions.Format?

解决EF Core中使用SQL Server FORMAT函数过滤波斯历月份的问题

EF Core的EF.Functions.Format确实没有三个参数的重载,要在数据库端完成波斯历月份过滤,有两种可行方案:

方案一:使用原生SQL查询

直接通过FromSqlRaw编写包含FORMAT函数的SQL语句,EF Core会将查询直接发送到数据库执行:

// 静态过滤月份为5的情况
var query = context.UserBaseInfos
    .FromSqlRaw("SELECT * FROM UserBaseInfos WHERE FORMAT(BirthDate, N'MM', 'fa-IR') = N'5'")
    .AsQueryable();

// 动态传入目标月份(使用参数化查询避免SQL注入)
int targetMonth = 5;
var query = context.UserBaseInfos
    .FromSqlRaw("SELECT * FROM UserBaseInfos WHERE FORMAT(BirthDate, N'MM', 'fa-IR') = {0}", targetMonth.ToString())
    .AsQueryable();

方案二:注册自定义数据库函数映射

通过注册自定义DbFunction,将SQL Server的FORMAT函数映射到EF Core可识别的方法,这样就能在LINQ查询中直接调用:

  1. 在你的DbContext中定义静态方法并标记[DbFunction]特性:
public class YourDbContext : DbContext
{
    public DbSet<UserBaseInfo> UserBaseInfos { get; set; }

    // 映射SQL Server的FORMAT内置函数
    [DbFunction("FORMAT", IsBuiltIn = true)]
    public static string FormatDateTime(DateTime date, string format, string culture)
    {
        // 仅用于EF Core查询翻译,无需实现具体逻辑
        throw new NotImplementedException();
    }

    // DbContext的其他配置(如OnConfiguring等)...
}
  1. 在LINQ查询中调用该自定义函数:
int targetMonth = 5;
var query = context.UserBaseInfos
    .Where(q => YourDbContext.FormatDateTime(q.BirthDate, "MM", "fa-IR") == targetMonth.ToString());

注意事项

  • FORMAT函数返回的是字符串类型,所以过滤时要和字符串形式的月份值比较(比如"5"而非数字5)。
  • 如果BirthDate是可空类型(DateTime?),需要将自定义函数的参数类型改为DateTime?。

内容的提问来源于stack exchange,提问作者Mohammad Komaei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:17:39