web-dev-qa-db-ja.com

"SELECT VALUE"-LINQ / Entity Frameworkクエリの値キーワード

このステートメントでキーワード「値」は何を意味しますか、どこでもっと知りたいですか?
キーワード「値」を省略するとどうなりますか?以下のコードでは、zはエンティティフレームワーククラスです。

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の変数を返す関数内にあります。

26
NealWalters

それは Entity SQL 構文です。 Valueキーワードでは、1つの値のみを指定でき、行ラッパーは追加されません。

読む ESQLのSELECTステートメントに関する記事

エンティティSQLは、SELECT句の2つのバリアントをサポートしています。最初のバリアントである行選択は、SELECTキーワードによって識別され、投影する必要がある1つ以上の値を指定するために使用できます。返された値の周りに行ラッパーが暗黙的に追加されるため、クエリ式の結果は常に行のマルチセットになります。

行選択の各クエリ式はエイリアスを指定する必要があります。エイリアスが指定されていない場合、Entity SQLはエイリアス生成ルールを使用してエイリアスを生成しようとします。

SELECT句のもう1つのバリアントである値選択は、SELECT VALUEキーワードによって識別されます。指定できる値は1つだけで、行ラッパーは追加されません。

したがって、クエリから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();
31