2011-07-27 8 views
1

次のコードがあります。私のメソッドには文字列の戻り値の型があります。リアクティブエクステンション - 変数がいっぱいになるまでフローを停止

public string GetRedemeptionNumber() 
{ 

string _batchNumber = "test"; 
var _loadBatchName = Observable.ForkJoin(_context.QuerySingleOrDefault(
      _context.GetRedemptionsQuery().Where(x => x.ReceiveBatchName.StartsWith(_batchNumber)) 
      .OrderByDescending(x => x.ReceiveBatchName) 
      .Take(1))) 
      .Do(u => _redemptionBatch = u.FirstOrDefault()) 
           .Select(x => new Unit()) 
           .Finally(() => 
           { 
             _batchNumber = _redemptionBatch.Name; 

             //this doesnt work since a return isnt allowed 
             return _batchNumber; 
            } 
           }); 

     _loadBatchName.Subscribe(); 


     return _batchNumber; 
} 

私の問題は、これが実行され、設定される前に_batchNumberを返すことです。空の_batchNumberが返されます。これが私の.finallyの外に戻り、_batchNumberが私の.finallyの中から満たされるのを待つことを止める方法はありますか?

私のコードでは、私の.finallyが返却を許可していないので、今は明らかに機能しません。

+0

実際にここで何をしたいのですか?たぶんあなたの代わりにあなたは集計をしたいですか? –

+0

_batchNumberはメソッドの初期に設定されています。このコードは最後に設定する前に_batchNumberの戻り値まで実行されます。私が望むのは、メソッドの最後にあるreturn _batchNumberの前に実行が停止することです。私は集計が何をするのか正確にはわかりません。 – gevjen

+0

私は、このコードの目標を説明しています - *シナリオは何ですか? –

答えて

2

コードにはいくつか問題があります。

Rxが返るまでブロックしたい場合は、最初にRxを使用して多くのポイントはありません。それはブロックしないことについてです。したがって、実際にIObservable<string>を返し、stringを返さないといけません。

また、OrderByDescendingを持つクエリでは、観測可能でない列挙型を使用することが多いので、何らかの形でクエリを観測可能にする必要があります。

ForkJoinこのクエリではあなたのために何もしないようです。なぜあなたはそれを使いましたか?

Do & Finally演算子のいずれも意味をなさない。

いずれにせよ、私はあなたのコードをコンパイルするものにリファクタリングできませんでしたが、私はそれを近づけました。これから始めて、何を変える必要があるか教えてください。

public static IObservable<string> GetRedemeptionNumber() 
{ 
    var _batchNumber = "test"; 

    var q = 
     _context.GetRedemptionsQuery() 
     .Where(x => x.ReceiveBatchName.StartsWith(_batchNumber)) 
     .OrderByDescending(x => x.ReceiveBatchName) 
     .Take(1); 

    return (from u in _context.QuerySingleOrDefault(q) 
      from z in u 
      select z.Name).Take(1); 
} 
関連する問題