【问题标题】:Mapping SQL functions in Entity Framework with constant parameters在实体框架中使用常量参数映射 SQL 函数
【发布时间】:2017-07-04 10:47:12
【问题描述】:

我的代码严重依赖 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);
}

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

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

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

【问题讨论】:

  • 不确定我是否理解有关常量参数的部分。这有帮助吗? stackoverflow.com/a/29539227/1236044
  • @jbl 您链接的答案是如何将DbFunctionAttribute 与所有参数都传递给SQL 的函数一起使用。我没有看到它像我想要的那样向 SQL 函数添加了一个固定参数。

标签: c# sql-server entity-framework


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多