2010-12-30 6 views
1

Ich habe eine Methode, die eine Liste von anonymen Objekten mit einer berechneten Spalte wie diese zurückgeben sollte:Mit DatDiff in Entity Framework auf einer SQL CE-Datenbank

 var tomorrow = DateTime.Today.AddDays(1); 
     return from t in this.Events 
       where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue) 
       select new 
       { 
        Client = t.Activity.Project.Customer.Name, 
        Project = t.Activity.Project.Name, 
        Task = t.Activity.Task.Name, 
        Rate = t.Activity.Rate.Name, 
        StartTime = t.StartTime, 
        EndTime = t.EndTime.Value, 
        Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", t.StartTime, t.EndTime.Value)/60), 
        Description = t.Activity.Description 
       }; 

Leider bekomme ich folgende Fehler von der Funktion DateDiff:

die angegebene Methode 'System.Nullable 1[System.Int32] DateDiff(System.String, System.Nullable 1 [System.DateTime], System.Nullable`1 [System.DateTime])' von der Art 'System.Data.Objects.SqlClient.SqlFunctions' kann nicht in übersetzt Ein LINQ to Entities speichert den Ausdruck.

Irgendwelche Ideen, was ich hier falsch gemacht haben könnte?

EDIT: Ich habe auch versucht, die EntityFunctions-Klasse erwähnt here, aber das hat nicht so gut funktioniert.

Minutes = EntityFunctions.DiffMinutes(t.EndTime, t.StartTime), 

Antwort

4

[Bearbeiten]

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("mi", t.StartTime, t.EndTime.Value)/60) 

nicht SQL CE unterstützt.

Hours = ((TimeSpan)(t.EndTime.Value - t.StartTime)).TotalHours 

löst eine DbArithmeticExpression Exception

Also, ich glaube, Sie werden es in zwei Schritten zu tun haben. Ergreifen Sie die benötigten Daten und berechnen Sie den Zeitunterschied im Speicher.

+0

Haben Sie getestet das? – Omar

+0

Das ist, womit ich angefangen habe, und es konnte nicht übersetzt werden. Also suchte ich und der empfohlene Ansatz war, SqlFunctions zu verwenden. –

+0

Mit diesem Code bekomme ich die Ausnahme: ** DbArithmeticExpression Argumente müssen einen numerischen gemeinsamen Typ haben. ** –

0

Sie bitten den EF-Provider, das DATEDIFF in SQL zu verarbeiten, was in keiner Version von SQL möglich ist. Verwendung nativer Funktionen Datetime:

var tomorrow = DateTime.Today.AddDays(1); 
     return from t in this.Events 
       where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue) 
       select new 
       { 
        Client = t.Activity.Project.Customer.Name, 
        Project = t.Activity.Project.Name, 
        Task = t.Activity.Task.Name, 
        Rate = t.Activity.Rate.Name, 
        StartTime = t.StartTime, 
        EndTime = t.EndTime.Value, 
        Hours = t.EndTime.Value(t.StartTime.Subtract).Hours, 
        Description = t.Activity.Description 
       }; 
+0

Hallo Dave, Danke für deine Antwort. Ich probierte 'Stunden = t.EndTime.Value.Subtract (t.StartTime)' und ich erhielt die Fehlermeldung ** LINQ to Entities erkennt die Methode 'System.TimeSpan Subtract (System.DateTime)' und diese Methode nicht kann nicht in einen Geschäftsausdruck übersetzt werden. ** –

+0

EF versucht immer noch, in T-SQL zu übersetzen. Sie werden wahrscheinlich die Ergebnismenge ohne datediff erhalten und dann in eine neue projizieren müssen. –

0

Zwei Möglichkeiten, entfernen Wert von EndTime:

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", t.StartTime, t.EndTime)/60) 

Oder verwenden DateDiffHour:

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiffHour(t.StartTime, t.EndTime) 
+0

Hallo Shahid! Vielen Dank für Ihre Antwort. Leider gibt mir die erste Option die gleiche Fehlermeldung. Und die zweite, nun, es gibt keine solche Methode "DateDiffHour". –

+0

Die DateDiffHour-Methodenreferenz finden Sie hier: http://msdn.microsoft.com/en-us/library/bb495790.aspx Aber es kann nicht von CE-Framework unterstützt werden. Ansonsten würde ich lieber Daten innerhalb C# -Code behandeln, anstatt SQL-spezifisch, wie von @ Steven Kimpe erwähnt. – ShahidAzim