“SELECT VALUE” - LINQ / Entity Framework查询中的值关键字

时间:2013-03-13 13:30:38

标签: linq entity-framework linq-to-entities

关键字"值"在这个陈述中意味着什么,我将在哪里学习更多? 如果我省略关键字"值"会发生什么?在下面的代码中,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类型变量的函数中。

1 个答案:

答案 0 :(得分:30)

这是Entity SQL语法。 Value关键字只允许指定一个值,并且不添加行包装。

阅读article about SELECT statement in ESQL

  

实体SQL支持SELECT子句的两种变体。首先   变量,行选择,由SELECT关键字标识,并且可以   用于指定应该投出的一个或多个值。   因为在返回的值周围隐式添加了行包装器,   查询表达式的结果始终是多行的行。

     

行select中的每个查询表达式都必须指定别名。如果不   指定了别名,Entity 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();