namespace YLErp.Modules.VolatilityModule { /// /// 交易对冲波动率数据提供 /// public class TradeHedgeVolProvider { readonly DateTime _valueDate; Dictionary _dicData; public TradeHedgeVolProvider(DateTime valueDate) { _valueDate = valueDate.Date; } /// /// 如果设为true程序内部将不会再进行数据初始化, /// 这样做的目的是为了少量数据获取时避免初始化带来的性能损失 /// public bool Initialized { get; set; } private void Initialize() { if (_dicData != null) { return; } lock (this) { if (_dicData != null) { return; } if (Initialized) { _dicData = new Dictionary(); } else { //只取3个月以内的 var startDate = _valueDate.AddMonths(-3); using (var db = DbContextFactory.GetYLDbContext()) { var query1 = from a in db.trade_hedge_vol where a.ValueDate > startDate && a.ValueDate <= _valueDate group a by a.TradeId into g select new { TradeId = g.Key, ValueDate = g.Max(n => n.ValueDate) }; var query2 = from a in query1 join b in db.trade_hedge_vol on a equals new { b.TradeId, b.ValueDate } select new { b.TradeId, b.TradeSavedVol }; _dicData = query2.ToDictionary(n => n.TradeId, m => (double?)m.TradeSavedVol); } } } } public bool TryGetVol(int tradeId, out double vol) { Initialize(); if (!_dicData.TryGetValue(tradeId, out var dvol) && tradeId > 0) { using (var db = DbContextFactory.GetYLDbContext()) { _dicData[tradeId] = dvol = db.trade_hedge_vol .Where(v => v.TradeId == tradeId && v.ValueDate <= _valueDate) .OrderByDescending(v => v.ValueDate).Select(n => (double?)n.TradeSavedVol).FirstOrDefault(); } } if (dvol.HasValue) { vol = dvol.Value; return true; } vol = 0; return false; } } }