2017-07-04 2 views
3

Ich habe Code, der stark von ISO Kalenderwochen abhängt; seine Persistenz-Schicht 6.Mapping SQL-Funktionen in Entity Framework mit konstanten Parametern

In C#, um die Entity Framework erfolgt über habe ich eine Erweiterungsmethode zu Datetime hinzugefügt:

// 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); 
} 

Ich möchte für diese Erweiterung Methode als auch in IQueryable s arbeiten, und Ordnen Sie es der SQL Server-Funktion DATEPART(iso_week, self) zu.

Das bedeutet, dass ich DATEPART mit einem ersten Parameter aufrufen möchte, der immer'iso_week' ist. Der zweite Parameter sollte DateTime in der C# -Methode übergeben werden. Soweit ich weiß, funktioniert DbFunctionAttribute nur, wenn beide Parameter Parameter der Funktion sind.

Ist es möglich, eine solche Zuordnung durchzuführen, oder muss ich eine gespeicherte Prozedur erstellen, die DATEPART(iso_week, @param) aufruft und diese Prozedur aufrufen?

+0

nicht sicher, ich verstehe den Teil über den konstanten Parameter. Könnte das helfen? https://StackOverflow.com/a/29539227/1236044 – jbl

+0

@Jbl Die Antwort, die Sie verknüpften, ist, wie Sie das 'DbFunctionAttribute' mit einer Funktion verwenden, in der alle Argumente in SQL übergeben werden. Ich sehe nicht, dass es der SQL-Funktion einen festen Parameter hinzugefügt hat, so wie ich es möchte. –

Antwort

0

konnte ich nicht einen Weg zu tun finden, was ich wollte, so tat ich folgendes:

eine skalare Wertfunktion in

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

Import die Funktion in die EDMX (einfach durch Aufruf Update von Database)

<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> 

Aktualisieren Sie die IsoWeek Erweiterungsfunktion mit einem DbFunctionAttribute.

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

Jetzt kann ich dateTime.IsoWeek() in C# -Code sowie in Entity-Famework-Linq-Abfragen verwenden.

Verwandte Themen