奇怪的观测异常

问题描述:

我使用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

我终于找到了解决我的问题。事实证明,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 
       }; 
} 

它的工作原理,但看起来很丑,如果任何人有办法让它更漂亮,我会理解的。

问题不在于'new'关键字,而在于OrderModel2类型的两个实例不相等,即使它们是用相同的构造参数创建的。

  1. 覆盖你的对象的Equals方法:

    这可以通过三种方式来解决。

  2. 将ObticsEqualityComparerAttribute应用于您的类,并使用Obtics使用的特定相等比较器。
  3. 使用存储库创建工厂,当使用相同的构造参数调用时,该存储库将返回相同的对象实例。

你似乎已经使用了3号,但我认为你的代码可能更简单和通用。