使用常量参数映射实体框架中的SQL函数

时间:2017-07-04 10:47:13

标签: 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)

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

是否可以执行此类映射,还是需要创建一个调用DATEPART(iso_week, @param)并调用该过程的存储过程?

1 个答案:

答案 0 :(得分:0)

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

在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()。