Конвертировать SQL-запрос в сущность SQL - PullRequest
0 голосов
/ 16 марта 2012

Мне нужно управлять хранением данных иерархии в моей базе данных. Но сейчас я столкнулся с проблемой. Я использую сущность 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 ]

3 голосов
/ 16 марта 2012

Отсутствует;

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;}
  ....
}
0 голосов
/ 16 марта 2012

Если у вас будут проблемы в будущем, вы можете использовать Linker.Это приложение может конвертировать sql в linq код из-за модели.Фактически, анализируя очень сложный запрос, я понял, что невозможно полностью контролировать вывод t-sql, но в любом случае это было чрезвычайно полезно

0 голосов
/ 16 марта 2012

Вам не хватает ; в начале. И почему ты += строка. Вы можете просто сделать так:

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

Используйте знак @". Легче читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...