public Task <List <object> > MapEntityAsync(object item)
     {
         if (item is TradesConverter.Contract.TradeLogItem model)
         {
             var converted = new TradeLogItem
             {
                 TradeId         = model.TradeId,
                 UserId          = model.UserId, //model.HashedUserId,
                 WalletId        = model.WalletId,
                 Direction       = model.Direction.ToString(),
                 OrderType       = model.OrderType,
                 OrderId         = model.OrderId,
                 Asset           = model.Asset,
                 Volume          = model.Volume,
                 Price           = model.Price,
                 DateTime        = model.DateTime,
                 OppositeOrderId = model.OppositeOrderId,
                 OppositeAsset   = model.OppositeAsset,
                 OppositeVolume  = model.OppositeVolume,
                 IsHidden        = model.IsHidden,
             };
             if (model.WalletType == "Trading")
             {
                 converted.WalletId = converted.UserId;
             }
             if (model.Fee != null)
             {
                 converted.Fee = new TradeLogItemFee
                 {
                     FromClientId = model.Fee.FromClientId,
                     ToClientId   = model.Fee.ToClientId,
                     DateTime     = model.Fee.DateTime,
                     Volume       = (decimal)model.Fee.Volume,
                     Asset        = model.Fee.Asset,
                     Type         = model.Fee.Type,
                     SizeType     = model.Fee.SizeType,
                     Size         = model.Fee.Size.HasValue ? (decimal)model.Fee.Size.Value : (decimal?)null,
                 }
             }
             ;
             item = converted;
         }
         return(Task.FromResult(new List <object> {
             item
         }));
     }
 }
        private static void InitCache(
            TradeLogItem item,
            DataContext context,
            ILog log)
        {
            _dict?.Clear();

            DateTime from = item.DateTime.Date;
            DateTime to   = from.AddDays(1);

            string query = $"SELECT * FROM dbo.{DataContext.TradesTable} WHERE DateTime >= '{from.ToString(_format)}' AND DateTime < '{to.ToString(_format)}'";
            var    items = context.Database.GetDbConnection().Query <TradeLogItem>(query).ToList();

            _dict      = items.GroupBy(i => i.TradeId).ToDictionary(g => g.Key, g => g.ToList());
            _cacheDate = from;
            log.WriteInfo(
                nameof(InitCache),
                nameof(TradeSqlFinder),
                $"Cached {items.Count} items from sql for {from.ToString(_format)}.");
        }
        public static TradeLogItem FindInDb(
            TradeLogItem item,
            DataContext context,
            ILog log)
        {
            if (_dict == null ||
                _dict.Count == 0 && item.DateTime.Date != _cacheDate ||
                _dict.Count > 0 && _dict.First().Value.First().DateTime.Date != item.DateTime.Date)
            {
                InitCache(item, context, log);
            }

            if (!_dict.ContainsKey(item.TradeId))
            {
                return(null);
            }

            var fromDb = _dict[item.TradeId].FirstOrDefault(c =>
                                                            c.WalletId == item.WalletId &&
                                                            c.Asset == item.Asset &&
                                                            c.OppositeAsset == item.OppositeAsset);

            return(fromDb);
        }