2013-03-13 7 views
23

Was bedeutet das Schlüsselwort "Wert" in dieser Aussage, und wo würde ich gehen, um mehr zu lernen?
Was passiert, wenn ich das Schlüsselwort "value" weglasse? Im folgenden Code ist z eine Entitätsframework-Klasse."SELECT VALUE" - Wert Schlüsselwort in LINQ/Entity Framework Abfrage

string queryString = "SELECT VALUE q from x.zs as q where q.a = @parm;" 
ObjectQuery<z> query = context.CreateQuery<z> 
    (queryString, new ObjectParameter("parmname",parmvalue)); 
return query.First(); 

(Dies ist ein Teil einer Übungsfrage für eine Prüfung).

Der obige Code ist in einer Funktion, die eine Variable vom Typ z zurückgibt.

Antwort

30

Das ist Entity SQL Syntax. Value Mit dem Schlüsselwort keyword kann nur ein Wert angegeben werden, und es wird kein Zeilenwrapper hinzugefügt.

Lesen article about SELECT statement in ESQL

Entity SQL zwei Varianten der SELECT-Klausel unterstützt. Die erste Variante, Zeilenauswahl, wird durch das Schlüsselwort SELECT identifiziert und kann verwenden, um einen oder mehrere Werte anzugeben, die projiziert werden sollen. Da ein Zeilenwrapper implizit um die zurückgegebenen Werte hinzugefügt wird, ist das Ergebnis des Abfrageausdrucks immer eine Mehrfachmenge von Zeilen.

Jeder Abfrageausdruck in einer Zeilenauswahl muss einen Alias ​​angeben. Wenn kein Aliasname angegeben ist, versucht Entity SQL, einen Alias ​​mithilfe der Aliasgenerierungsregeln zu generieren. Die andere Variante der SELECT-Klausel, value select, wird durch das Schlüsselwort SELECT VALUE mit identifiziert. Es kann nur ein Wert angegeben werden, , und es wird kein Zeilenwrapper hinzugefügt.

Also, wenn Sie z Objekt aus der Abfrage materialisieren wollen, sollten Sie SELECT VALUE Syntax verwenden (sonst werden Sie Ausnahme erhalten: Besetzung von MaterializedDataRecord bis z-Typ nicht gültig ist).

Ohne VALUE Stichwort erhalten Sie von Zeilen festgelegt:

string esql = "SELECT q from x.zs as q where q.a = @parm;"; 
ObjectQuery<DbDataRecord> query = context 
     .CreateQuery<DbDataRecord>(esql, new ObjectParameter("parm",parmvalue)); 
var result = query.First();