c# - 使用常量参数在 Entity Framework 中映射 SQL 函数

标签 c# sql-server entity-framework

我的代码严重依赖于 ISO 日历周;它的持久层是使用 Entity Framework 6 完成的。

在 C# 中,我为 DateTime 添加了一个扩展方法:

// From https://stackoverflow.com/a/11155102/112964
public static int IsoWeek(this DateTime self) {
    var day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(self);
    if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    {
        self = self.AddDays(3);
    }

    // Return the week of our adjusted day
    return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(self, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}

我希望此扩展方法也能在 IQueryable 中工作,并将其映射到 SQL Server 函数 DATEPART(iso_week, self)

这意味着我想用第一个参数 always 'iso_week' 调用 DATEPART。第二个参数应该是传递给 C# 方法的 DateTime。据我了解,DbFunctionAttribute 只有在两个参数都是函数的参数时才有效。

是否可以执行这样的映射,或者我是否需要创建一个存储过程来调用 DATEPART(iso_week, @param) 并调用该过程?

最佳答案

我找不到做我想做的事情的方法,所以我做了以下事情:

在 SQL Server 中创建一个标量值函数

CREATE FUNCTION IsoWeek(@date DATETIME)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
  RETURN datepart(ISO_WEEK, @date);
END

将函数导入 EDMX(只需调用从数据库更新)

<Schema Namespace="Some.Namespace" …>
… 
    <Function Name="IsoWeek" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" ReturnType="int">
      <Parameter Name="date" Type="datetime" Mode="In" />
    </Function>

使用 DbFunctionAttribute 更新 IsoWeek 扩展函数。

[DbFunction("Some.Namespace", "IsoWeek")]
public static int IsoWeek(this DateTime self) {
    …
}

现在我可以在 C# 代码和 Entity-Famework-Linq-Queries 中使用 dateTime.IsoWeek()。

关于c# - 使用常量参数在 Entity Framework 中映射 SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44903886/

相关文章:

asp.net-mvc - 为什么 UserManager.CreateIdentityAsync() 寻找 IdentityRole 以及如何修复?

c# - 是否有可能使用 Entity Framework 4,让主键在对象上的名称与在表中的名称不同?

c# - 语言间的方法差异(Python->C#)

c# - 在运行时更改外部 exe 图标

c# - Firefox 的缓存问题

c# - Autofac 修饰使用程序集扫描注册的开放泛型

c# - Entity Framework ,从 datetime 迁移到 datetimeoffset

sql - 在需要条件的上下文中指定的非 boolean 类型的表达式

sql - 如何将两个相同的数据库数据合并为一个?

c# - ESQL 不工作