2012-07-09 84 views
0

我使用Obtics庫進行live-linq查詢。奇怪的觀測異常

但我不能通過這個奇怪的例外,這是毫無意義的。

這裏是我的查詢:

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獲取「已取消」狀態。我認爲這是因爲我在查詢的頂部過濾了取消的訂單,但這些相關性我不知道。

+0

如何讓它更具可讀性? – 2012-07-09 14:27:34

+0

我傾向於建議針對文件共享網站,因爲它們存在安全風險,並且通常它們是從中下載的小工具。使用pastie.org或Github Gists(如果你可以''))' – halfer 2012-07-09 14:30:30

+0

理查德,對不起回滾:http://www.thefreedictionary.com/weird – halfer 2012-07-09 14:32:01

回答

0

我終於找到了解決我的問題。事實證明,Obtics在使用lambda進行飛行類創建時存在問題,例如

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 
       }; 
} 

它的工作原理,但看起來很醜,如果任何人有辦法讓它更漂亮,我會理解的。

0

問題不在於'new'關鍵字,而在於OrderModel2類型的兩個實例不相等,即使它們是用相同的構造參數創建的。

  1. 覆蓋你的對象的Equals方法:

    這可以通過三種方式來解決。

  2. 將ObticsEqualityComparerAttribute應用於您的類,並使用Obtics使用的特定相等比較器。
  3. 使用存儲庫創建工廠,當使用相同的構造參數調用時,該存儲庫將返回相同的對象實例。

你似乎已經使用了3號,但我認爲你的代碼可能更簡單和通用。