2010-12-27 17 views
2

Ich habe ein Problem mit Linq zu Entitäten, für die ich keine Problemumgehung finden kann.LINQ to Entities erkennt die Methode nicht

Dies ist mein Code:

var queryResult = result.Where(x => x.FollowedUp.Value.GetWeekFromDateTime() 
    == DateTime.Now.GetWeekFromDateTime()).Select(x => x); 

und meine Erweiterung Methode ist:

public static int GetWeekFromDateTime(this DateTime date) 
    { 
     return System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); 
    } 

Problem:

Ich erhalte „LINQ to Entities nicht erkennen Sie die Methode GetWeekFromDateTime "und Ich verstehe, warum, weil es versucht, meinen Code in SQL-Code zu übersetzen und "GetWeekFromDateTime" nicht existiert. Aber wie mache ich das? Ich möchte die Wochennummer von dem Datum, das ich von meiner Datenbank erreiche, mit dieser Wochennummer vergleichen.

Vielen Dank!

Antwort

7

Wenn Sie einen anständigen Index für das Feld FollowedUp haben, möchten Sie vielleicht hier Ihren Algorithmus so anpassen, dass Sie nur über C# berechnen, wie die Min- und Max-Daten für die aktuelle Woche sind, und Ihre Abfrage stattdessen als value >= min && value <= max ausführen. Auf diese Weise führen Sie keine Berechnung für jede einzelne Zeile der Datenbank durch.


Aber Ihre Frage mehr direkt zu beantworten, auch wenn ich nicht empfehlen, auf diese Weise in Ihrem speziellen Fall zu tun: die Berechnung Sie können eine SQL-Funktion erstellen, die hier der Fall ist, importieren Zusammenhang auf Ihre Daten, und rufen Sie es stattdessen in Ihrer Abfrage auf.

Dies würde dazu führen, dass jede Zeile diese Funktion durchläuft, bedenken Sie. Auch wenn du es immer noch so machen willst, solltest du auch ändern, wie du die aktuelle Woche bekommst; Sie müssen diesen Wert nur einmal abrufen und eine Variable dafür in der Abfrage verwenden ... Sie müssen nicht versuchen, sie für jede Zeile neu zu berechnen.

+0

Hmm das FollowedUp Feld nicht habe einen Index dafür. Es ist ein DateTime-Feld – syncis

+0

Ein Feld, das Sie suchen, sollte auch entsprechende Index (e) haben. Sonst machen Sie einen Table-Scan. Wenn es sich nicht um eine sehr kleine Tabelle handelt, ist es mit einem Index für das Feld "FollowedUp" besser, zumindest für die bestimmte Abfrage, die ich empfehle. –

1

Linq-to-Entities unterstützt derzeit keine kulturspezifischen Abfragefunktionen. Siehe die akzeptierte Antwort auf this question für weitere Details. Ich glaube, dass Sie Ihre gesamte Ergebnismenge in eine Nicht-L2E-Sammlung zurückziehen müssen, die Sie dann mit Ihrer GetWeekFromDateTime-Methode filtern können.

+0

Ich hatte es nicht einmal aus diesem Blickwinkel betrachtet; +1 Ich denke, er wäre immer noch besser dran, wenn er nur die Min/Max-Tage der Woche erhält und dann ein indiziertes "FollowedUp" -Feld nach Werten in diesen Bereichen abfragt. –

+0

Ich denke, Sie haben eine vollständigere Antwort (+1), aber ich wollte sicherstellen, dass der OP eine Idee davon hatte, warum L2E den Fehler geworfen hat. –

+0

Du meinst also, ich sollte alles bekommen und dann die erste Sammlung damit filtern? Hmm versuchen, herauszufinden, wie .... – syncis

0

Sie müssen entweder alle Datensätze auf dem Client als ein Array oder eine Liste abrufen, dann filtern Sie sie mit einer Abfrage, wie Sie auf dem Array ausgeführt haben (anstelle von ON LINQ to SQL) oder Sie haben zu wandeln es in einer Syntax, die LINQ to SQL verstehen:

 int thisWeek = (DateTime.Now.DayOfYear + (int)(new DateTime(DateTime.Now.Year, 1, 1).DayOfWeek))/7; 
     var queryResult = 
      (from row in result 
      let WeekNum = (row.FollowedUp.Value.DayOfYear + 
      (int)(new DateTime(row.FollowedUp.Value.Year, 1, 1).DayOfWeek))/7 
      where WeekNum == thisWeek 
      select row); 

LINQ to SQL eigentlich intelligent genug ist, um die WEEKNUM Ausdruck zu SQL-Code wie folgt zu konvertieren:

(DATEPART(DayOfYear, [t0].[FollowedUp]) + 
(CONVERT(Int,(DATEPART(dw, CONVERT(DATETIME, CONVERT(NCHAR(2), 1) + 
('/' + (CONVERT(NCHAR(2), 1) + ('/' + CONVERT(NCHAR(4), 
DATEPART(Year, [t0].[FollowedUp]))))), 101)) + 
(@@DATEFIRST) + 6) % 7)))/7 
+0

das ist genau das, was ich will aber in Linq zu Entities :( – syncis

+0

Wie unterscheidet sich das oder inkompatibel mit Linq zu Entities? Erhalten Sie immer noch einen Fehler bei der Verwendung dieser Abfrage mit Linq zu Entitäten? – BlueMonkMN

Verwandte Themen