2012-03-16 7 views
0

私のデータベースに格納されている階層データを管理する必要があります。しかし、今私は問題に直面しています。私は私のasp.netのエンティティ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; 

を想定SQLクエリは、ここに私のテーブル構造

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 

編集

まあは、[OK]を、私は少しググと問題がCreateQueryはので、ここでEntitySql構文ではなく、T-SQL、問題を使用していますです。

あなたはExecuteStoreQueryメソッドを使用することができます。

結果は予想の列にマップされたクラスである
string result = @" ... " 

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

:あなたは開始時に;欠けている

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

こんにちは私は;;を追加すると試してみてください "; RPL(P_TASK_ID、C_TASK_ID、taskSeq)AS;今すぐ取得 "クエリの構文が有効ではありません近辺 ';'、1行目、3列目。 – user998405

+0

@ user998405私の回答を更新しました –

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

こんにちは、私のコードを更新します。私はerror.THansを解決するのを助けてください:) – user998405

0

将来的に問題がある場合は、Linkerを使用できます。このアプリは、モデルのためにSQLをlinqコードに変換することができます。実際には非常にdifficaltクエリを分析している間、私はそれが完全に出力t - SQLを制御することは不可能だと思ったがとにかくそれは非常に有用だった