2012-03-16 91 views
0

我需要管理存儲在我的數據庫中的層次結構數據。但是現在我面臨一個問題。我爲我的asp.net使用實體sql。那麼現在,我該如何將這些sql轉換爲實體查詢?下面是SQL查詢我想轉換爲實體框架查詢將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

缺失;

string result = " ; WITH RPL 

編輯

好吧,好吧,我用Google搜索了一下,問題是CreateQuery使用EntitySql語法,而不是T-SQL,所以這裏的問題。

您可以使用ExecuteStoreQuery方法:

string result = @" ... " 

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

如果結果是映射到投影列一類:

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

您好,我嘗試添加「; WITH RPL(P_TASK_ID,C_TASK_ID,taskSeq)AS」;。現在我得到「查詢語法無效。近期';',第1行第3列。」 – user998405 2012-03-16 09:57:24

+0

@ user998405我更新了我的答案 – 2012-03-16 10:24:03

0

你缺少;在開始。而你爲什麼+=的字符串。你可以這樣做:

string [email protected]" 
       ;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"; 

使用@"標誌。更易於閱讀。

+0

嗨,我更新了我的代碼。請幫我解決這個錯誤。 – user998405 2012-03-16 10:13:32

0

如果你必須在未來的問題可以用連接器。由於模型的原因,該應用可以將sql轉換爲linq代碼。事實上,雖然分析非常difflict查詢我意識到,它是不可能的完全控制輸出t-sql,但無論如何這是極其有益的