2012-10-17 3 views
6

Ich bin ein großer Fan von benannten Parametern anstelle von String-basierten Parameter-Injektion. Es ist typsicher und sicher gegen die meisten Formen der SQL-Injektion. In altem ADO.NET würde ich ein SqlCommand-Objekt und eine Menge SqlParameters für meine Abfrage erstellen.Bei Verwendung von DbSet <T> .SqlQuery(), wie benannte Parameter verwenden?

var sSQL = "select * from Users where Name = @Name"; 
var cmd = new SqlCommand(conn, sSQL); 
cmd.Parameters.AddWithValue("@Name", "Bob"); 
cmd.ExecuteReader(); 

nun in Entity Framework, es erscheint (auf diesen Link) zu einer einfachen String.Format Anweisung und String-Injektion wieder zurückgebildet haben: (zur Diskussion vereinfacht)

MyRepository.Users.SqlQuery("Select * from Users where Name = {0}", "Bob"); 

Gibt es eine Möglichkeit, benannte Parameter mit der Entity Framework DbSqlQuery-Klasse zu verwenden?

Antwort

4
var param = new ObjectParameter(":p0", "Bob"); 
MyRepository.Users.SqlQuery("Select * from Users where Name = :p0", param); 
+0

Wo ist das dokumentiert? Und welche Namensformate sind im SQL-Body zulässig? Kann es den @ name Stil nicht unterstützen? –

+0

@EricFalsken. Sie können in [hier in MSDN] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectparameter.aspx) sehen, ** dieser \ @name-Stil wird unterstützt **. – gdoron

+0

Perfekt! Vielen Dank! –

2

Da kann ich nicht sagen, ich bin zur Festsetzung der andere Antwort:

var param = new ObjectParameter("p0", "Bob"); 
MyRepository.Users.SqlQuery("Select * from Users where Name = :p0", param); 

Sie haben noch einen Doppelpunkt auf den Namen zu setzen, wenn ein Object instanziieren. Deshalb hat SLC den Fehler bekommen, den er in seinem Kommentar erwähnt hat.

Verwandte Themen