Wie kann ich formatieren von Datums-Literale in die dynamische linq?
Ich bin mit dynamic Linq, um die Daten für die user-Eingabe von Suchkriterien. Meine Abfrage ist in Ordnung, mit Ausnahme der vom Benutzer ausgewählten Daten. Mein aktuelle code:
StringBuilder whereClause = new StringBuilder();
if (startDate.HasValue || endDate.HasValue)
{
DateTime searchStartDate = startDate.HasValue ? startDate.Value : DateTime.MinValue;
DateTime searchEndDate = endDate.HasValue ? endDate.Value : DateTime.MaxValue;
whereClause.AppendFormat("Date >= {0} && Date <= {1}",
searchStartDate.Date.ToUniversalTime(),
searchEndDate.Date.ToUniversalTime());
}
if (whereClause.Length > 0)
{
return (from p in this.repository.GetQueryable<Party>() select p)
.Where(whereClause.ToString())
.ToList();
}
Die Abfrage fällt da der Vergleich gemacht wird zwischen einem DateTime-Feld und ein Int32-Feld, d.h. die Abfrage interpretiert hat meine Datums-Literale werden als Integer-zahlen.
Wie soll ich die Formatierung der Daten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum sind Sie Parsen von strings in einem LINQ-Ausdruck? Der ganze Punkt von LINQ ist zu vermeiden.
UPDATE:
In Reaktion auf die Kommentare: ich bin Gebäude, die man zur Laufzeit. Die Frage ist nicht, run-time vs. compile-Zeit; es ist "in strings" vs "in code". StringBuilder-Objekt können Sie text anfügen; LINQ erlaubt Kette lamdbas. Es funktioniert alles das gleiche --- außer deinem code ist typsicher und syntax geprüft mit lambdas.
Demostrate diesem Konzept weiter kann der folgende code kompiliert & läuft wunderbar, und Sie können ändern Sie die Where-Klausel auf der Basis der Werte von
oddsOnly
undlowerLimit
.Je nachdem, wie Sie die Werte einstellen, wird es mit null, einer oder beide der where-Klauseln.
Verwenden
statt.
In Antwort auf Val Kommentar:
OK, dann kannst du das tun:
Müssen Sie konvertieren Sie das Datum in der Abfrage in einen string und dann vergleichen Sie es mit einer in Anführungszeichen eingeschlossenen string-literalen. Ohne die Anführungszeichen der parser ist inerpreting die zahlen eingefügt, die in der where-Klausel als Ganzzahlen - was sollte erklären, dass der Fehler, den Sie ursprünglich hatte.
Dynamische LINQ-string müsste so Aussehen:
Dies ist in der Dokumentation erwähnt in der DynamicQuery Projekt in der download-erwähnt bei http://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library.
Beachten Sie, es gibt nicht eine
new
vor derDateTime
Konstruktor.Ich versuchte dies und es funktioniert. Ich bin mit Telerik ist RadGrid Steuerung für ASP.NET AJAX. Das raster baut die filter-Zeichenfolge, und ich musste das hinzufügen der filter auf meine Anfrage zu bekommen, die filter zum ausführen in der Datenbank mit LINQ to Entities. Das problem ist, dass der erzeugte filter benötigt, um geändert werden, um ein wenig für die Arbeit mit LINQ to Entities-im Gegensatz zu LINQ to Objects. Es war dabei ein
DateTime.Parse()
was nicht unterstützt LINQ to Entities.