我的代码很大程度上取决于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)
并调用该过程的存储过程?
答案 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()。