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

本文关键字:sql 实体 框架 转换 查询 | 更新日期: 2023-09-27 18:28:04

我需要管理存储在数据库中的层次结构数据。但现在我面临一个问题。我的asp.net使用的是实体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列。
请帮忙。

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

缺少;

string result = " ; WITH RPL

编辑

好吧,我在谷歌上搜索了一下,问题是CreateQuery使用的是EntitySql语法,而不是T-SQL,所以这里是问题所在。

您可以使用ExecuteStoreQuery方法:

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

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

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

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

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";

使用@"符号。更容易阅读。

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

都非常有用