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 を使用したときに式が実際に計算されるため、変更されたクロージャにアクセスできる Visible = service.IsSessionProcessing(u.UploadSessionId) >どこかで、つまり .ToList()などのプリフォームを作成します。

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

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

1
私が何かが欠落していない限り、この u は式のローカルですです。
追加された 著者 Marc Gravell,
まあ、私は true false のいずれかであると推測しているので、 しかし、 SessionId は異なっていますか?
追加された 著者 Marc Gravell,
... u はクロージャではないので、 u u.UploadSessionId も実際には変更されたクロージャではありません。さて、あなたの _db.Sessions が何であるか(そしてどの配管が真ん中にあるか)によっては、どこかのバグかもしれません...しかし、変更されたクロージャーには関係しません。
追加された 著者 Marc Gravell,
返される匿名型コレクションを使用すると、service.IsSessionProcessing(u.UploadSessionId)のすべての値が最後のものと等しくなります...
追加された 著者 TheBoyan,

2 答え

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

1
追加された
@bojanskr私が言っていることは、 service はここの 唯一の閉鎖 です。したがって、あなたが本当に "修正された閉鎖"を見ているなら、それが唯一の候補です。可能性が高い(IMO):バグは、あなたがそれが何であるか/どこにあるとは思わない。
追加された 著者 Marc Gravell,
私は完全に理解しているか分からない。あなたはそれを新しいかどうかを再割り当てしないことを言っているか、linq式でそれを呼び出すことはできませんか?
追加された 著者 TheBoyan,
助けてくれてありがとう、私はバグがどこにあるのか知っていると思うし、あなたが正しいと思う、それは全く閉鎖ではない、それはおそらく私が呼んでいるサービスにあるだろう
追加された 著者 TheBoyan,

実際のバグは、式の文脈で関数を呼び出そうとしています。式はデータベース操作を表す式の意味がありません。 私はあなたが実際に以下を試したと思います:

// 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();
0
追加された