2011-09-29 205 views
1

您好我有一個方法,如:Select語句花費很長的時間

public JsonResult GetActivities(int id) 
{ 
    var activities = ActivityRepository.GetAll().Where(x => x.AreaId == id); 

    var jsonData = new { 
     rows = activities.Select(q => new { 
      Id = q.Id.ToString(), 
      q.Descriptor 
     }).ToList() 
    }; 

    return Json(jsonData, JsonRequestBehavior.AllowGet); 
} 

它工作正常,但我覺得這行:

var jsonData = new 
{ 
    rows = activities.Select(q => new { Id = q.Id.ToString(), q.Descriptor }).ToList() 
}; 

需要很長的時間來執行。

難道有人請向我解釋爲什麼這是和有沒有更有效的方法?

+2

看起來不錯,但我們需要更多信息......如果您有SQL分析器,請運行該分析器並查看正在訪問數據庫的查詢。 – geofftnz

+0

您是如何確定線路需要很長時間的? –

+0

查詢返回多少行?什麼是Id的數據類型?我問,因爲整數比GUID更快。 –

回答

1

該問題最有可能與您的數據庫莫名其妙......

正如@geofftnz已經提到過,那麼你應該使用SQL事件探查器(例如:AnjLab Sql Profiler),並找出發生了什麼事情的幕後。

的原因在於它沒有花費很長的時間:

var activities = ActivityRepository.GetAll().Where(x => x.AreaId == id); 

是,它不是發送到數據庫的任何疑問,但因爲返回類型IEnumerable<Activity>(懶惰)的。

然而,當你這樣做:

var jsonData = new 
{ 
    rows = activities.Select(q => new 
    { 
     Id = q.Id.ToString(), 
     q.Descriptor 
    }).ToList() 
}; 

它會讓一個查詢,並在.ToList()(渴望)訪問數據庫。

+0

在這一點上不是'活動'內存中'IEnumerable '?第二個查詢如何觸及數據庫? – Bastardo

+0

@JohnnyCageWins:根據OP描述的行爲,「活動」幾乎肯定是由某種LINQ提供者支持的查詢(很可能與數據庫綁定)。對'.ToList'的調用強制查詢被評估,即它到達數據庫的時間。 – StriplingWarrior

+0

@Str謝謝。 – Bastardo