2011-10-28 60 views
1

我有以下代碼:如何避免在linq表達式中訪問修改後的閉包?

ServiceSoapClient service = new ServiceSoapClient(); 
    var dataSource = (from u in _db.Sessions 
         where u.DeletedOn == null 
         select new 
         { 
          SessionId = u.UploadSessionId, 
          FileName = u.FileName, 
          CreatedBy = u.User.UserName, 
          Partner = u.Company.Name, 
          CreatedOn = u.CreatedOn, 
          Visible = service.IsSessionProcessing(u.UploadSessionId) 
         }) 
        .OrderByDescending(x => x.CreatedOn); 

...這裏當然問題是訪問修改關閉,因爲當我使用dataSource地方即預製棒.ToList()或類似的表達實際上是計算Visible = service.IsSessionProcessing(u.UploadSessionId)部分。

這裏的問題是我無法立即執行.ToList(),因爲我需要將它用作控件的數據源。

Linq有什麼方法可以避免這種情況嗎?我可以在表達式本身中使用局部變量,以便使用真實值進行計算嗎?

+0

除非我失去了一些東西,這'u'是* *已經向當地的表情......是什麼報告,作爲改性封閉? –

+0

當我使用返回的匿名類型集合...來自service.IsSessionProcessing(u.UploadSessionId)的所有值等於最後一個... – TheBoyan

+0

好吧,我猜他們都是「真」或'false',所以沒有*許多選項;然而,'SessionId'是不同的嗎? –

回答

1

這裏的「修改關閉」是service。所以...不要重新分配service

+0

我不確定我完全理解。你是說不用新的或不用linq表達式來調用它? – TheBoyan

+0

@bojanskr我說的是:'服務'是***這裏唯一的關閉***。所以如果你真的看到「修改封閉」,那是唯一的候選人。更可能的是(IMO):錯誤不是你認爲的東西/地方。 –

+0

感謝您的幫助,我想我知道錯誤在哪裏,而且您是對的,它根本就不在關閉中,它很可能在我打電話的服務中 – TheBoyan

0

真正的錯誤在於嘗試在表達式的上下文中調用函數,這不會使表達數據庫操作的表達式感興趣。 我想你實際上試過如下:

// Database operation, no soap client funny business here. 
var list = (
    from u in _db.Sessions 
    where u.DeletedOn == null 
    orderby x.CreatedOn descending 
    select new 
    { 
    SessionId = u.UploadSessionId, 
    FileName = u.FileName, 
    CreatedBy = u.User.UserName, 
    Partner = u.Company.Name, 
    CreatedOn = u.CreatedOn, 
    }).ToList(); 

// From now on you are not in a database anymore, it's pure linq-to-objects. You can call the service. 
ServiceSoapClient service = new ServiceSoapClient(); 
var dataSource = (from u in list select new { 
SessionId = u.SessionId, 
FileName = u.FileName, 
CreatedBy = u.CreatedBy, 
Partner = u.Partner, 
CreatedOn = u.CreatedOn, 
Visible = service.IsSessionProcessing(u.SessionId) 
}).ToList();