2013-03-13 60 views
23

關鍵字「value」在本聲明中的含義是什麼?我將在哪裏瞭解更多信息?
如果我忽略關鍵字「值」會發生什麼?在下面的代碼中,z是一個實體框架類。「SELECT VALUE」 - LINQ/Entity Framework查詢中的值關鍵字

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(); 

(這是考試練習題的一部分)。

上述代碼位於一個返回z類型變量的函數中。

回答

30

這就是Entity SQL語法。 Value關鍵字只允許指定一個值,並且不添加行包裝。

閱讀article about SELECT statement in ESQL

實體SQL支持SELECT子句的兩種變體。第一個 變體行選擇由SELECT關鍵字標識,並且可以是 用於指定應該投影出的一個或多個值。 由於行包裝隱式添加在返回的值的周圍,因此查詢表達式的結果始終是多行的集合。

行select中的每個查詢表達式都必須指定一個別名。如果未指定 別名,則實體SQL將嘗試使用別名生成規則生成別名。

SELECT子句的其他變體value select由 SELECT VALUE關鍵字標識。它只允許指定一個值, 並且不添加行包裝器。

所以,如果你想從您的查詢兌現z對象,你應該使用SELECT VALUE語法(否則你將得到例外:投從MaterializedDataRecord到z類型無效)。

沒有VALUE關鍵字,您將設置行:

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();