我需要管理存储在我的数据库中的层次结构数据。但现在我遇到了一个问题。我正在使用实体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栏......
请帮忙。
答案 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是不可能的,但无论如何它是极其有用的