2012-04-10 7 views
6

Ich habe eine Linq-Abfrage, die auf eine var Typ zurückgibt myQryVergleich Daten in Abfrage LINQ mit

var myQry = from ..... 

Dies ist eine große Linq alle Datensätze zurückgibt, die ich weiter filtern müssen. In einem meiner Wenn-Bedingungen habe ich einen Filter, der so läuft, um das Datum zu überprüfen. Ich muss überprüfen, ob der Name den eingegebenen Namen enthält und genau dem Geburtsdatum entspricht.

Ich habe versucht, die kompiliert und lief, aber funktionierte nicht korrekt

myQry.Where(x => x.FirstName.Contains(strName) && DateTime.Compare(x.BirthDt, searchDt)>=0).ToList() 

Dann habe ich versucht diese, die eine Ausnahme geworfen gab

myQry.Where(x => x.FirstName.Contains(strName) && (x.BirthDt- searchDt).Days == 0).ToList(); 

„einen numerischen gemeinsamen Typ DbArithmeticExpression Argumente haben müssen“ Für eine solche Situation, in der ich eine where-Klausel für meine Abfrage verwende, was wäre der beste Weg, einen Datumsvergleich durchzuführen? Welche Art von Operationen sind in der Where-Klausel einer LinQ-Abfrage nicht erlaubt?

Vielen Dank für Ihre Zeit ...

+0

Was ist der Typ von 'x.BirthDt'? Was ist der Typ von 'searchDt'? Anscheinend sind sie nicht beide "DateTime". – Servy

+0

Und bist du in linq2sql oder linq2entities? –

+1

Beide sind Datetime. Ich bin in linq2sql – user20358

Antwort

3

In diesem Fall möchten Sie möglicherweise SQL Server-spezifische Funktionen mit Methoden aus der Klasse SqlMethods verwenden.

Ihre zweite Abfrage könnte als

myQry.Where(x => x.FirstName.Contains(strName) && 
    SqlMethods.DateDiffDay(x.BirthDt, searchDt) == 0).ToList() 

neu geschrieben werden, die wie

SELECT ... FROM Table WHERE FirstName 
    LIKE '@p0' AND DATEDIFF(Day, BirthDt, @p1) = @p2 

wo p0, p1 und p2 sind Parameter etwas übersetzt werden.

3

Try this:

myQry.Where(x => x.FirstName.Contains(strName) && 
x.BirthDt.Date == searchDt.Date).ToList() 

Beachten Sie, dass für die oben, sowohl BirthDt und searchDt arbeiten müssen gültige Datetime-Werte sein. Sie vergleichen jetzt nur den Date-Teil der DateTime-Werte und verwerfen den Time-Part.

1

Welche Operationen unterstützt werden, hängt vom ORM-Framework ab (Nhibernate, EF usw.), aber im Grunde können Sie davon ausgehen, dass die Methode, die Sie verwenden, keine wörtliche Übersetzung in SQL hat unterstützt werden.

Deshalb ist der Betreiber == unterstützt wird, aber nicht DateTime.Compare Methode oder Betreiber - in DateTime wird nicht unterstützt, da es keine klare Übersetzung hat.

Versuchen Sie immer, sich an den einfachsten Operator zu halten und Methoden zu vermeiden. Wenn das immer noch fehlschlägt, müssen Sie Google umkreisen, wenn diese spezielle Methode von Ihrem ORM unterstützt wird.

1

Ich stimme Leniel Makeri in Bezug auf die Aktualisierung der Where-Klausel und den Vergleich von Datumsangaben anstelle von Datumsangaben zu. Für ein Geburtsdatum ist normalerweise der Zeitpunkt der Geburt nicht relevant. Um Ihre zweite Frage zu beantworten

Welche Arten von Operationen sind in der Where-Klausel einer LinQ Abfrage nicht zulässig?

Where() ist ein Erweiterungsverfahren, das auf IEnumerable<T> oder IQueryable<T> arbeitet. Wir können sehen, von F12 trifft auf Where einen Blick auf den Quellcode zu nehmen:

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); 

Die unterstützten Operationen als Prädikate sind bekannt. Ein Prädikat ist ein Delegat, das ein Argument vom Typ TSource akzeptiert und ein Bool zurückgibt, das uns mitteilt, ob die Bedingung übereinstimmt oder nicht. Dies ist im obigen Code im zweiten Parameter zu sehen: Func<TSource, bool> predicate

Sie können das Prädikat so definieren, wie Sie möchten.Solange es ein bool zurückgibt und 1 Parameter vom Typ TSource akzeptiert.

Dies wird in der Regel durch die Definition eines Lambda-Ausdrucks erreicht, was Leniel Macaferi für Sie getan hat.