2017-11-30 4 views
0

Ich verwende diese Abfrage, um Daten aus der Datenbank abzurufen.LINQ konvertiert Zeichenfolge in Sonderzeichen

string nfc = "53f8372c";  
var temp = db.tempTable.AsNoTracking().Where(
       x => 
        x.uid.Equals(nfc, StringComparison.CurrentCultureIgnoreCase) 
        && x.ENDED == null 
        && x.STATUS.Equals(Constants.ACTIVE) 
      ); 

Die SQL, die von dieser Abfrage generiert wird, ist:

{SELECT 
"Extent1"."ID" AS "ID", 
"Extent1"."uid" AS "uid", 
"Extent1"."ENDED" AS "ENDED", 
"Extent1"."STATUS" AS "STATUS", 
FROM "tempTable" "Extent1" 
WHERE (("Extent1"."uid" = :p__linq__0) AND ("Extent1"."ENDED" IS NULL) AND ('Active' = "Extent1"."STATUS"))} 

Warum es 53f8372c zu konvertiert: p__linq__0?

+2

'x.uid.Equals (nfc, StringComparison.CurrentCultureIgnoreCase)' nfc ist Variable und nicht Zeichenkette literal/Konstante? – lad2025

+2

Das ist ein SQL-Parameter. – juharr

+0

@ lad2025 es ist eine Variable –

Antwort

6

Das ist nur die Parametrisierung der SQL. Wenn Sie sich die an die Abfrage übergebenen Parameter ansehen, sehen Sie, dass :p__linq__0 einen Wert von 53f8372c hat.

Diese Parametrisierung ist hilfreich, da der Server den Abfrageplan zwischenspeichern und für die gleiche Abfrage mit anderen Parameterwerten wiederverwenden kann.

+0

Es ist auch besser, parametrisiertes SQL zum Schutz vor SQL-Injection zu verwenden. https://stackoverflow.com/questions/4712037/what-is-parameterized-query – Marisa

+1

@Marisa: Ja, obwohl es mindestens * weniger * eines Problems ist, wenn die SQL automatisch generiert wird - LINQ * könnte * verwendet haben String-Wert und maskiert es bei Bedarf. Das würde natürlich immer noch dazu führen, dass sich Fehler in der Flucht einschleichen. –

+0

@Marisa Parametrisierte Abfragen haben auch Nachteile, zum Beispiel werden sie keine gefilterten Indizes verwenden. Das ist ein bisschen ein Randfall obwohl. – DavidG

Verwandte Themen