0

live-linq クエリに Obtics ライブラリを使用しています。

しかし、まったく意味のないこの奇妙な例外を渡すことはできません。

これが私のクエリです:

var query = ExpressionObserver.Execute(() =>
        from o in _orders.DefaultIfEmpty(new OrderStatusViewModel())
        where o.State != OrderStateEnum.Canceled
        group o by o.Isin
            into g
            let name = _referenceData.GetInstrumentName(g.Key)
            orderby name ascending
            select new ComplexRowViewModel(_referenceData)
            {
                UnderlyingOrder = g.First(),
                PrimaryExchange = (from q in _quotes.DefaultIfEmpty(new QuoteTickViewModel()).Where(w => w.Exchange == _referenceData.GetPrimaryExchangeId(g.Key) && w.Isin == g.Key && w.Provider == ProviderEnum.Bloomberg)
                                   select new SimpleRowViewModel()
                                   {
                                       UnderlyingQuote = q
                                   }).First(),
                Groupped = (from y in _orders.DefaultIfEmpty(new OrderStatusViewModel())
                            join x in _quotes.DefaultIfEmpty(new QuoteTickViewModel()) on new { y.Isin, y.Exchange }
                                equals new { x.Isin, x.Exchange }
                            where
                                y.Isin == g.Key &&
                                y.State != OrderStateEnum.Canceled &&
                                x.Provider == ProviderEnum.Tradebase &&
                                x.Exchange !=
                                _referenceData.GetPrimaryExchangeId(g.Key)
                            group x by new { x.Exchange }
                                into p
                                select new SimpleRowViewModel()
                                {
                                    UnderlyingQuote = p.First()
                                }
                           ),
                Uncompressed = (from o in _orders.DefaultIfEmpty(new OrderStatusViewModel())
                                where o.State != OrderStateEnum.Canceled && o.Isin == g.Key
                                select new UncompressedRowViewModel() { UnderlyingOrder = o }),

                Compressed = (from o in _orders.DefaultIfEmpty(new OrderStatusViewModel())
                              where o.State != OrderStateEnum.Canceled && o.Isin == g.Key
                              group o by new { o.LimitPrice, o.OrderSide } into x
                              select new CompressedRowViewModel()
                              {
                                  Ask = x.Key.OrderSide == OrderSideEnum.Sell ? (decimal?)x.Key.LimitPrice : (decimal?)null,
                                  AskSize = x.Key.OrderSide == OrderSideEnum.Sell ? x.Select(s => s.Quantity).Aggregate((c, n) => c + n) : 0,
                                  Bid = x.Key.OrderSide == OrderSideEnum.Buy ? (decimal?)x.Key.LimitPrice : (decimal?)null,
                                  BidSize = x.Key.OrderSide == OrderSideEnum.Buy ? x.Select(s => s.Quantity).Aggregate((c, n) => c + n) : 0,
                                  Exchange = string.Join(", ", x.Select(s => s.Exchange)),
                                  Isin = x.First().Isin.ToString(),
                                  OrderBuyCount = x.Key.OrderSide == OrderSideEnum.Buy ? x.Count() : 0,
                                  OrderSellCount = x.Key.OrderSide == OrderSideEnum.Sell ? x.Count() : 0,
                                  RowSide = x.Key.OrderSide == OrderSideEnum.Sell ? RowSide.Sell : RowSide.Buy
                              })}
    ).Cascade();

GridData = query;

このすべてを可能にするクラスをアップロードしました。http://www.4shared.com/file/ce_V8PPh/MarketData.html

例外は次のとおりです。

InvalidOperationException, Added item does not appear at given index '0'.

しかし、アイテムはすでにそこにあるので、これは意味がありません。

OrderStatus が「Cancelled」状態になるまで、すべて正常に機能します。クエリの上でキャンセルされた注文をフィルタリングしているためだと思いますが、これがどのように関連しているのかわかりません。

4

2 に答える 2

0

私はついに私の問題の解決策を見つけました。Obticsには、ラムダを使用したオンザフライクラスの作成に問題があることが判明しました。

from o in orders where o.state == "active" select new OrderModel2 {Underlying = o}

新しいキーワードはすべて台無しになります。このクラスの作成は手動で処理する必要があります。

とにかく、2日間のヘッドスマッシングの後、私はこれだけのコードを持っていることになりました。

private void CreateQueries()
{
    var query = ExpressionObserver.Execute(() => (from o in _orders
                                                  where o.State != OrderStateEnum.Canceled
                                                  group o by o.Isin
                                                      into g
                                                      let name = _referenceData.GetInstrumentName(g.Key)
                                                      orderby name ascending
                                                      select GetComplexRowViewModel(
                                                                                    g.First()
                                                                                    ,
                                                                                    (from p in _quotes
                                                                                     where
                                                                                         p.Isin == g.Key &&
                                                                                         p.Exchange == _referenceData.GetPrimaryExchangeId(g.Key) &&
                                                                                         p.Provider == ProviderEnum.Bloomberg
                                                                                     select GetSimpleRowViewModel(p))
                                                                                     ,
                                                                                     (from q in _quotes
                                                                                      where
                                                                                          q.Isin == g.Key &&
                                                                                          q.Provider == ProviderEnum.Tradebase &&
                                                                                          g.Select(s => s.Exchange).Contains(q.Exchange)
                                                                                      select GetSimpleRowViewModel(q))
                                                                                      ,
                                                                                      (from o in _orders
                                                                                       where o.Isin == g.Key
                                                                                       && o.State != OrderStateEnum.Canceled
                                                                                       group o by new { o.LimitPrice, o.OrderSide } into x
                                                                                       select GetCompressedRowViewModel
                                                                                       (
                                                                                           x.Key.OrderSide == OrderSideEnum.Sell ? (decimal?)x.Key.LimitPrice : (decimal?)null,
                                                                                           x.Key.OrderSide == OrderSideEnum.Sell ? x.Select(s => s.Quantity).Aggregate((c, n) => c + n) : 0,
                                                                                           x.Key.OrderSide == OrderSideEnum.Buy ? (decimal?)x.Key.LimitPrice : (decimal?)null,
                                                                                           x.Key.OrderSide == OrderSideEnum.Buy ? x.Select(s => s.Quantity).Aggregate((c, n) => c + n) : 0,
                                                                                           string.Join(", ", x.Select(s => s.Exchange)),
                                                                                           x.First().Isin.ToString(),
                                                                                           x.Key.OrderSide == OrderSideEnum.Buy ? x.Count() : 0,
                                                                                           x.Key.OrderSide == OrderSideEnum.Sell ? x.Count() : 0,
                                                                                           x.Key.OrderSide == OrderSideEnum.Sell ? RowSide.Sell : RowSide.Buy
                                                                                       ))
                                                           ,
                                                           (from o in _orders
                                                            where o.Isin == g.Key
                                                            && o.State != OrderStateEnum.Canceled
                                                            select GetUncompressedRowViewModel(o))

                                                                                     ))).Cascade();
    GridData = query;
}


// Obtics 
private ConcurrentDictionary<string, ComplexRowViewModel> _complexRowViewModels = new ConcurrentDictionary<string, ComplexRowViewModel>();
private ComplexRowViewModel GetComplexRowViewModel(OrderStatusViewModel model, IEnumerable<SimpleRowViewModel> primaryExchanges, IEnumerable<SimpleRowViewModel> groupped
    , IEnumerable<CompressedRowViewModel> compressed, IEnumerable<UncompressedRowViewModel> uncompressed)
{
    if (model == null)
        return _complexRowViewModels.GetOrAdd("", s2 => new ComplexRowViewModel());

    return _complexRowViewModels.GetOrAdd(model.Isin,
                                          s2 =>
                                          new ComplexRowViewModel(_referenceData) { UnderlyingOrder = model, PrimaryExchange = primaryExchanges.DefaultIfEmpty(new SimpleRowViewModel()).First(), Groupped = groupped, Compressed = compressed, Uncompressed = uncompressed });
}

private ConcurrentDictionary<string, SimpleRowViewModel> _simpleRowViewModels = new ConcurrentDictionary<string, SimpleRowViewModel>();
private SimpleRowViewModel GetSimpleRowViewModel(QuoteTickViewModel model)
{
    if (model == null)
        return _simpleRowViewModels.GetOrAdd("", s2 => new SimpleRowViewModel());

    return _simpleRowViewModels.GetOrAdd(model.Isin + model.Exchange,
                                                        s2 =>
                                                        new SimpleRowViewModel() { UnderlyingQuote = model });
}

private ConcurrentDictionary<string, UncompressedRowViewModel> _uncompressedRowViewModels = new ConcurrentDictionary<string, UncompressedRowViewModel>();
private UncompressedRowViewModel GetUncompressedRowViewModel(OrderStatusViewModel model)
{
    if (model == null)
        return _uncompressedRowViewModels.GetOrAdd("", s2 => new UncompressedRowViewModel());

    return _uncompressedRowViewModels.GetOrAdd(model.InternalId,
                                                        s2 =>
                                                        new UncompressedRowViewModel() { UnderlyingOrder = model });
}

private ConcurrentDictionary<string, CompressedRowViewModel> _compressedRowViewModels = new ConcurrentDictionary<string, CompressedRowViewModel>();
private CompressedRowViewModel GetCompressedRowViewModel(decimal? Ask, int AskSize, decimal? Bid, int BidSize, string Exchange, string Isin, int OrderBuyCount, int OrderSellCount, RowSide RowSide)
{

    return new CompressedRowViewModel()
               {
                   Ask = Ask,
                   AskSize = AskSize,
                   Bid = Bid,
                   BidSize = BidSize,
                   Exchange = Exchange,
                   Isin = Isin,
                   OrderBuyCount = OrderBuyCount,
                   OrderSellCount = OrderSellCount,
                   RowSide = RowSide
               };
}

それは動作しますが、見た目は醜いです。誰かがそれをより美しくする方法を持っているなら、私は感謝されます。

于 2012-07-11T08:25:57.543 に答える
0

問題は「new」キーワードにあるのではなく、タイプ OrderModel2 の 2 つのインスタンスが同じ構築引数で作成されているにもかかわらず、等しくないことにあります。

これは、次の 3 つの方法で解決できます。

  1. オブジェクトの Equals メソッドをオーバーライドします。
  2. Obtics が使用する特定の等値比較子を使用して、クラスに ObticsEqualityComparerAttribute を適用します。
  3. 同じ構築引数で呼び出されたときに同じオブジェクト インスタンスを返すリポジトリを持つファクトリを作成します。

あなたのコードはもっとシンプルで一般的なものになると思いますが、あなたは 3 番を使用したようです。

于 2012-12-19T09:47:17.107 に答える