Ich verwende LINQ-> WCF Data Services-> EF, die eine Teilmenge von LINQ mit ein paar Einschränkungen unterstützt. Ich hatte keine Probleme damit, einmal die Tricks und Workarounds für verschiedene Dinge zu lernen, aber ich würde gerne einen wiederverwendbaren Ausdruckgenerator machen, um nur den Date
Teil einer DateTime
zu vergleichen.Generieren eines Ausdrucks für ein IQueryable <T>
Mit regulären EF können Sie EntityFunctions.TruncateTime
(EF < 6) oder DbFunctions.TruncateTime
(EF6 +) verwenden, aber dies funktioniert nicht über Datendienste.
Meine Lösung war bisher immer wieder dieses Chaos einer Klausel, wo zu bauen:
.Where(x => x.DateProperty.Year == DateToCompare.Year &&
x.DateProperty.Month == DateToCompare.Month &&
x.DateProperty.Day == DateToCompare.Day);
Das ist nur böse ist, immer wieder schreiben zu haben (aber es funktioniert), so dass ich versuchte, so etwas wie zu erstellen:
.WhereDate(x => x.DateProperty, DateToCompare);
etwas ähnliches tun würde, nur kurz und süß und lesbar - ich verabscheue repetitiven unnötig Gefühl Code.
Die Struktur ist kein Problem, ich weiß, ich brauche etwas, das IQueryable<T>
, Func<T, DateTime>
(oder Expression<Func<T, DateTime>>
) führt, und DateTime
und kehrt IQueryable<T>
.
public static IQueryable<T> WhereDate<T>(this IQueryable<T> data, Func<T, DateTime>> selector, DateTime date)
{
return data.Where(/*Something*/);
};
Wo ich Probleme habe, ist, nehmen diese und bauen einen Ausdruck, der ohne Verletzung der Einschränkungen des Ausdrucks Bäume, die in where-Klausel gesetzt werden kann. Ich bin mir nicht ganz sicher, wie ich eine existierende Abfrage nehmen und meine eigene where-Anweisung zu dem Ausdruck hinzufügen kann, ohne eine .Where
zu machen, was ich denke, könnte der Schlüssel hier sein. Ich denke, ich muss ein Expression<Func<T, DateTime>>
aufnehmen und etwas bauen, das das verwendet, um ein Expression<Func<T, bool>> to the tree and return it as an
IQueryable hinzuzufügen.
Jeder hat etwas Erfahrung damit, oder wissen, welche Dokumente ich lesen sollte?
Die größten Barrieren hier sind, dass Sie ein statementbasiertes Lambda nicht in einen Ausdruck umwandeln können und keine nicht unterstützten Funktionen in den Datendienst oder EF übergeben können. Das macht alle naiven Lösungen unmöglich, und so weit ich weiß, bleibt die Manipulation der manuellen Ausdrücke.
Werfen Sie einen Blick auf auf [Link] (https://msdn.microsoft.com/en-us/library/bb882637 (v = vs.110) .aspx) . –
Warum können Sie nicht einfach Ihren ersten Ausdruck in der Erweiterungsmethode zurückgeben? – user2697817
@ user2697817 Weil OP will es generisch und nützlich für jede Entität – DavidG