我的代码严重依赖于 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/