C# 无功扩展-停止流量,直到变量充满

C# 无功扩展-停止流量,直到变量充满,c#,silverlight,asynchronous,system.reactive,C#,Silverlight,Asynchronous,System.reactive,我有以下代码。我的方法有一个字符串返回类型 public string GetRedemeptionNumber() { string _batchNumber = "test"; var _loadBatchName = Observable.ForkJoin(_context.QuerySingleOrDefault( _context.GetRedemptionsQuery().Where(x => x.ReceiveBatchName.StartsWith

我有以下代码。我的方法有一个字符串返回类型

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。因此它返回一个空的批处理数。有没有办法阻止它运行到返回(my.finally之外)并等待从my.finally内部填充_batchNumber


我的代码现在显然不起作用,因为我的。最终不允许返回

您的代码确实存在一些问题

首先,如果你想阻塞直到Rx返回,那么使用Rx没有多大意义。它应该是关于不阻塞。因此,您应该真正返回
IObservable
,而不是
string

另外,要使查询具有降序的OrderByDescending,您需要使用可枚举的而不是可观察的,因此您的查询必须以某种方式转变为可观察的

在这个查询中,
ForkJoin
似乎对您没有任何帮助。你为什么用它

所有的
操作
最后
操作符也没有多大意义

在任何情况下,我都无法将您的代码重构为可编译的代码,但我已经很接近了。从这个开始,告诉我需要改变什么

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);
}
publicstaticiobservable getredemptionnumber()
{
var\u batchNumber=“测试”;
变量q=
_context.GetRedemptionsQuery()
.Where(x=>x.ReceiveBatchName.StartsWith(_batchNumber))
.OrderByDescending(x=>x.ReceiveBatchName)
.采取(1)项措施;
返回(来自_context.QuerySingleOrDefault(q)中的u)
从z到u
选择z.Name)。取(1);
}

您能描述一下您在这里真正想要做什么吗?也许您不想使用Finally,而是希望使用Aggregate?在方法的早期设置了_batchNumber。在我在Finally中设置它之前,此代码一直运行到返回_batchNumber。我想要的是在方法底部返回_batchNumber之前停止执行。我不确定聚合会做什么。我的意思是,描述一下这段代码的目标-场景是什么?我基本上是从各种变量(用户名、日期和一些其他硬编码项)创建一个batchNumber。我的batchnumber看起来像这个RCV-evjen-072711,在我有了这个batchnumber之后,我要做的是在数据库中查询这个数字,然后使用startsWith,在我的数据库中,这个batchnumber以-1或-2等结尾。然后我会增加最后一个数字。所以我可以得到一批RCV-gevjen-072711-2。这将是我需要返回的最后批次号。希望有意义。记录
\u context.QuerySingleOrDefault
\u context.GetRedemptionsQuery的返回类型对您很有用