2010-12-09 96 views
0

我有一個包裝類用於MVC應用程序,該應用程序設計爲循環訪問集合中的項目,並檢查當前用戶是否具有訪問該項目的權限它用於顯示。大多數情況下,它就像一個魅力。然而,對於一個特定的對象類型,它像一隻絕對的狗一樣運行,我無法弄清楚爲什麼。實現IEnumerable的MoveNext內部MoveNext的糟糕表現<T>

接口類是這樣寫的:

private readonly IEnumerable<T> _ViewData; 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (T item in _viewData) 
     { 
      if (item.UserCanEdit || item.UserCanView) 
       yield return item; 
     } 
    } 


    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

現在我的第一個問題是檢查我怎麼在這裏上的理解。我可能是錯的,但我的理解是,當我嘗試運行一個針對類型對象集合的foreach循環時,它永遠不需要使用System.Collections.IEnumerable.GetEnumerator() - 當然代碼永遠不會被擊中?

問題在於,當我嘗試在LogEntryViewDaya類中通過實體框架提供的日誌文件條目上使用此包裝器時,問題在於此。當代碼擊中GetEnumerator內部的foreach循環時,即使枚舉中只有20個項目,它也會停留整整6-8秒!

下面是LogEntryView

public class LogEntryViewData:BaseViewData 
{ 
    private LogEntry _entry; 
    public LogEntryViewData(LogEntry entry, ICustomerSecurityContext securityContext) : base(securityContext) 
    { 
     _entry = entry; 
    } 

    public string Application { get { return _entry.Application; } } 
    public string CurrentUser { get { return _entry.CurrentUser; } } 
    public string CustomerName { get { return _entry.CustomerName; } } 
    public DateTime Date { get { return _entry.Date; } } 
    public string Exception { get { return _entry.Exception; } } 
    public string HostName { get { return _entry.HostName; } } 
    public long Id { get { return _entry.Id; } } 
    public string Level { get { return _entry.Level; } } 
    public string Message { get { return _entry.Message; } } 
    public int? ProcessId { get { return _entry.ProcessId; } } 
    public int? ServiceId { get { return _entry.ServiceId; } } 
    public string ServiceName { get { return _entry.ServiceName; } } 
    public int? TaskId { get { return _entry.TaskId; } } 
    public int? TaskName { get { return _entry.TaskName; } } 
    public string Thread { get { return _entry.Thread; } } 
} 

代碼據我可以告訴有一個在實例化這些類沒有明顯的表現 - 把一個斷點在構造和F5ing通過似乎光滑的東西。

那麼爲什麼這些特定對象的集合如此緩慢地迭代?我不知道:感激的建議。

回答

2

您還沒有向我們展示該課程是如何填充的。我的猜想是時間正在進行數據庫查詢 - 特別是取決於所獲取的內容,可能只有一個查詢來獲取骨架實體,然後一個查詢每個UserCanEditUserCanView。這似乎不太可能(我曾預計該條目將在初始查詢中填充這些屬性),但只是可能的。

基本上,看它如何與你的數據庫進行交互。

我建議你嘗試編寫一個使用相同類的控制檯應用程序,這樣你就可以搞定它,比webapp更容易添加計時日誌等。

編輯:除了評論等其他一切,是否有任何理由,你不這樣做的一部分LINQ查詢?例如:

var query = db.LogEntries.Where(x => x.UserCanEdit || x.UserCanView); 

我欣賞它可能不會是相當那樣簡單,因爲UserCanEdit將取決於當前用戶等等 - 但它可能應該做一個數據庫查詢,而不是客戶端 - 側。

+0

好的,在這裏要表現出我的無知,但是我認爲當它的構造函數被調用時,該類被填充了?這發生在它進入foreach循環之前,似乎以令人滿意的速度發生。 – 2010-12-09 14:11:55