2011-10-28 10 views
1

私は次のコードを持っている:私は.ToList()または似たようなプリフォームどこかすなわちdataSourceを使用するときに式が実際に計算されているので、もちろんここでの問題が修正閉鎖へのアクセス権を持っているVisible = service.IsSessionProcessing(u.UploadSessionId)部分です...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); 

を。

ここでの問題は、コントロールのデータソースとしてそのまま使用する必要があるため、すぐに.ToList()を実行できないという問題です。

Linqでこれを避ける方法はありますか?実際の値で計算されるように、式自体にローカル変数を使用できますか?

+0

私は何かが欠けていない限り、この 'u'は*すでに*表現に対してローカルである...は修正クロージャとしてことを報告するものですか? –

+0

返される匿名型のコレクションを使用すると、service.IsSessionProcessing(u.UploadSessionId)のすべての値が最後のものと等しい... – TheBoyan

+0

まあ、私はそれらがすべて真であると推測していますまたは 'false'なので、*たくさんの*オプションではありません。しかし、 'SessionId'は違うのですか? –

答えて

1

ここでの「変更されたクロージャ」はserviceです。だから... serviceを再割り当てしないでください。

+0

私は完全に理解しているか分からない。あなたはそれを新しいかどうかを再割り当てしないことを言っているか、linq式でそれを呼び出すことはできませんか? – TheBoyan

+0

@bojanskr私が言っていることは: 'service'は***唯一の閉鎖***です。したがって、あなたが本当に "修正された閉鎖"を見ているなら、それが唯一の候補です。可能性が高い(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(); 
関連する問題