将sql查询转换为实体框架sql

时间:2012-03-16 09:48:56

标签: c# asp.net sql-server-2008 entity-framework-4.1

我需要管理存储在我的数据库中的层次结构数据。但现在我遇到了一个问题。我正在使用实体sql为我的asp.net。那么现在,我如何将这些sql转换为实体查询?这是我想要转换为实体框架查询的SQL查询

      WITH RPL ( P_TASK_ID, C_TASK_ID,taskSeq) AS
     (  SELECT  root.P_TASK_ID, root.C_TASK_ID ,root.Seq
        FROM [COMMON.TASK_REL_test] as root
      UNION ALL
        SELECT  child.P_TASK_ID, child.C_TASK_ID, child.Seq
        FROM [COMMON.TASK_REL_test] parent, [COMMON.TASK_REL_test] child
        WHERE  parent.C_TASK_ID = CHILD.P_TASK_ID
     )
SELECT DISTINCT P_TASK_ID, C_TASK_ID,taskSeq
 FROM RPL
  ORDER BY  P_TASK_ID, C_TASK_ID,taskSeq; 

这是我的表结构

   pID  CID   Seq
   NULL 1   1
    1   2   1
    1   3   2
    1   4   3
    2   5   1
    2   6   2
    3   7   1

这是我的插入表查询

INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID, Seq)
values (null,1,1)


INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID,Seq)
values (1,2,1)


INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID,Seq)
values (1,4,3)


INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID,Seq)
values (1,3,2)


INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID,Seq)
values (2,6,2)

INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID,Seq)
values (2,5,1)

INSERT into [COMMON.TASK_REL_test](P_TASK_ID,C_TASK_ID,Seq)
values (3,7,1)

这是我的编码

 private void createGridView()
        {
            try
            {


                using (ObjectContext ctx = new ObjectContext(gbcDbConnection.eObjqueryConnection))
                {
                    string result = @"
                                ;WITH RPL ( P_TASK_ID, C_TASK_ID,taskSeq) AS
                                (  SELECT  root.P_TASK_ID, root.C_TASK_ID ,root.Seq
                                   FROM LEWREDBEntities.[COMMON_TASK_REL_test] as root
                         UNION ALL
                                SELECT  child.P_TASK_ID, child.C_TASK_ID, child.Seq
                                 FROM LEWREDBEntities.[COMMON_TASK_REL_test] as parent, LEWREDBEntities.[COMMON_TASK_REL_test] as child
                        WHERE  parent.C_TASK_ID = CHILD.P_TASK_ID
                    )
                         SELECT DISTINCT P_TASK_ID, C_TASK_ID,taskSeq
                         FROM RPL
                         ORDER BY  P_TASK_ID, C_TASK_ID,taskSeq";
                    ObjectQuery<DbDataRecord> query = ctx.CreateQuery<DbDataRecord>(result);
                    string cde = query.ToTraceString();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }

        }

但我现在收到错误。
查询语法无效。近期';',第2行,第34栏......
请帮忙。

3 个答案:

答案 0 :(得分:3)

失踪;

string result = " ; WITH RPL

修改

好吧,好吧,我google了一下,问题是CreateQuery使用EntitySql语法,而不是T-SQL,所以问题就在这里。

您可以使用ExecuteStoreQuery方法:

string result = @" ... "

 var query = ctx.ExecuteStoreQuery<Result>(result);

其中result是映射到投影列的类:

public class Result
{
  public int P_TASK_ID {get; set;}
  ....
}

答案 1 :(得分:0)

您在开始时缺少;。你为什么要+=字符串。你可以这样做:

string result=@"
                ;WITH RPL ( P_TASK_ID, C_TASK_ID,taskSeq) AS
                    (  SELECT  root.P_TASK_ID, root.C_TASK_ID ,root.Seq
                        FROM [COMMON.TASK_REL_test] as root
                    UNION ALL
                        SELECT  child.P_TASK_ID, child.C_TASK_ID, child.Seq
                        FROM [COMMON.TASK_REL_test] parent, [COMMON.TASK_REL_test] child
                        WHERE  parent.C_TASK_ID = CHILD.P_TASK_ID
                    )
                SELECT DISTINCT P_TASK_ID, C_TASK_ID,taskSeq
                FROM RPL
                ORDER BY  P_TASK_ID, C_TASK_ID,taskSeq";

使用@"标志。更容易阅读。

答案 2 :(得分:0)

如果您将来遇到问题可以使用Linker。由于模型,这个应用程序可以将sql转换为linq代码。事实上,在分析非常困难的查询时,我意识到完全控制输出t-sql是不可能的,但无论如何它是极其有用的