Hintergrundseltsame Verhalten in Entity Framework Linq in String EndsWith Methode
Ich habe eine Tabelle, die nur eine Spalte enthält: Namen. Es gibt nur vier Zeilen drin, sagen
| Name |
| test1.com |
| test2.com |
| test3.com |
| test4.com |
Problem
Wenn ich
var email = "[email protected]";
Table.Where(x => email.EndsWith(x.Name));
abfragen werde ich eine leere Liste erhalten. Wenn ich aber alle Zeilen abfragen ersten und berechnen Wo im Speicher wie diese
var email = "[email protected]";
Table.ToList().Where(x => email.EndsWith(x.Name));
Ich werde eine Liste erhalten, enthält nur test2.com was richtig ist.
Die generierte SQL für die erste Abfrage
SELECT "Extent1"."Name" AS "Name"
FROM "USER"."Table" "Extent1"
WHERE ((NVL(INSTR(REVERSE(:p__linq__0), REVERSE("Extent1"."Name")), 0)) = 1)
I ersetzt habe versucht: p__linq__0 mit ‚[email protected]‘ und die Abfrage im sqldeveloper ausgeführt wird, ist das Ergebnis korrekt ist.
Weitere Informationen
Wenn ich EndsWith() zu Enthält() ändern, wird das Problem verschwunden sein. Hier ist die generierte SQL für Enthält()
SELECT "Extent1"."Name" AS "Name"
FROM "USER"."Table" "Extent1"
WHERE ((NVL(INSTR(:p__linq__0, "Extent1"."Name"), 0)) > 0)
Haben Sie eine Ahnung, was mit EndsWith falsch oder Methode REVERSE?
Umwelt
- EF5.0
- .NET4.5
- Oracle11g
- Diese Zeile betrifft mich 3
Dies ist ein großartiges Beispiel dafür, warum sollten wir die SQL EntityFramework Generiert immer überprüfen, wenn IQueryables direkt mit SQL. Ich kann nicht erklären, warum es das SQL generiert, das es tut ... aber es ist eine allgemeine Praxis geworden, mit fast jedem IQueryable zu überprüfen, das ich produziere. – Derek