将C#方法转换为存储过程

时间:2014-07-31 16:55:26

标签: c# sql sql-server entity-framework

我正在使用SQL Server来管理网站的数据。我刚刚决定向数据库添加两个新列,我想为表中的每一行填充这两列。要填充每个列,我使用另一个表中的信息。我已经创建了一个在C#中为我做的方法,但它需要很长时间。它大约35,000行。这是我的C#方法所做的,但我想知道将它作为存储过程是否更好,如果它更好,我怎么能去做呢?

    public void UpdateAssignedCountAndLastReponseDate()
    {
        //Loop through each task in the database 
        foreach (var task in IssueDb.AP_Tasks.ToList())
        {
            // Check to see if there is both not a null and a last response date
            if (task.AssignedCount != null && task.LastReponseDate != null) continue;
            //Check the task history for records
            var taskhistory = from x in IssueDb.AP_TaskHistory
                              where x.TaskID == task.TaskID && x.AssignDate != null
                              select x;
            //get last response date
            var maxAssignDate = (from th in IssueDb.AP_TaskHistory where task.TaskID == th.TaskID orderby th.AssignDate descending select th.AssignDate).FirstOrDefault();
            IssueDb.Entry(task).State = EntityState.Modified;
            task.LastReponseDate = maxAssignDate;
            //get count
            task.AssignedCount = taskhistory.Count();
            if (task.LastReponseDate == null)
                task.LastReponseDate = task.TaskDate;
            if (task.AssignedCount == null)
                task.AssignedCount = 0;
            //save these numbers to task columns in the DB
            IssueDb.SaveChanges();
        }
    }

我目前在ASP的EF5中这样做。 NET应用程序MVC

这是我到目前为止所做的:

   UPDATE [dbo].[AP_Tasks]
   SET [AssignedCount] =
   (
        CASE [AssignedCount] IS NULL THEN (SELECT *, COUNT(*) FROM [dbo].[AP_TaskHistory] INNER JOIN [AP_TaskHistory] WHERE [AP_TaskHistory].[TaskID] == [AP_Tasks].[TaskID] AND [AP_TaskHistory].[AssignDate] IS NOT NULL)

   );
   SET [LastReponseDate] =
   (
        CASE [AP_Tasks].[LastReponseDate] IS NULL
        THEN (SELECT FIRST(AssignDate) FROM [dbo].[AP_TaskHistory] INNER JOIN [AP_TaskHistory] WHERE [AP_TaskHistory].[TaskID] == [AP_Tasks].[TaskID] AND [AP_TaskHistory].[AssignDate] IS NOT NULL ORDER BY [AP_TaskHistory].[AssignDate] DESC)
   );

以下是我的错误:

Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'IS'.
Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'WHERE'.
Msg 195, Level 15, State 10, Line 11
'FIRST' is not a recognized built-in function name.

3 个答案:

答案 0 :(得分:2)

在SQL Server中,您可以执行连接其他表的更新语句。这是一个例子

UPDATE u
SET u.FirstName = t2.SomeColumn
FROM Users u
     INNER JOIN Table2 t2 ON (u.UserID = t2.UserID)

由于您使用的是EF,因此您可以将其放入迁移脚本中。

这种方法会快得多!

答案 1 :(得分:1)

我拿了你的更新声明并清理了它:

UPDATE  [dbo].[AP_Tasks]
SET     [AssignedCount] = ( SELECT  COUNT(*)
                            FROM    [dbo].[AP_TaskHistory]
                            WHERE  [AP_TaskHistory].[TaskID] = [AP_Tasks].[TaskID] AND  [AP_TaskHistory].[AssignDate] IS NOT NULL
                          ) ,
        [LastReponseDate] = ( SELECT    MAX(AssignDate)
                              FROM      [dbo].[AP_TaskHistory]
                              WHERE  [AP_TaskHistory].[TaskID] = [AP_Tasks].[TaskID] AND  [AP_TaskHistory].[AssignDate] IS NOT NULL
                            )
  1. 修正语法
  2. 删除了CASE声明,如果这些是新列,则不必担心现有数据

答案 2 :(得分:-1)

当然,使用存储过程会更快。

您的存储过程的代码看起来与您的C#代码非常相似,您可以使用while,if / else语句,...