public Status(ILogger <Status> logger, DBService db, DSoptions options, OnTheFlyScan onthefly, DecodeReplays decode, DSrest rest) { _logger = logger; _options = options; _onthefly = onthefly; _db = db; _decode = decode; _rest = rest; _logger.LogInformation("Start."); foreach (var ent in DSdata.Config.Replays) { string reppath = ent; if (reppath.EndsWith("/") || reppath.EndsWith("\\")) { reppath.Remove(reppath.Length - 1); } var plainTextBytes = Encoding.UTF8.GetBytes(reppath); MD5 md5 = new MD5CryptoServiceProvider(); string reppath_md5 = BitConverter.ToString(md5.ComputeHash(plainTextBytes)); ReplayFolder[reppath] = reppath_md5; } //ScanReplayFolders(); //if (isFirstRun && File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\sc2dsstats_web\\data.json")) { // BulkInsertOldData(); //} if (DSdata.Config.OnTheFlyScan) { _onthefly.Start(this); } }
public async Task ChangeOption(DSoptions _options) { if (_options.Chart.type == "bar") { ChartJsoptionsBar chartoptions = _options.Chart.options as ChartJsoptionsBar; chartoptions.scales.yAxes.First().ticks.beginAtZero = _options.BeginAtZero; var schartoptions = JsonConvert.SerializeObject(chartoptions); await ChartJSInterop.ChangeOptions(_jsRuntime, schartoptions); } }
public void Init(DSReplay replay, DSoptions _options) { DSPlayer pl = null; if (DSdata.Config.Players.Any()) { List <string> activePlayers = _options.Players.Where(x => x.Value == true).Select(s => s.Key).ToList(); pl = replay.DSPlayer.Where(x => activePlayers.Contains(x.NAME)).FirstOrDefault(); } else { pl = replay.DSPlayer.Where(x => x.NAME.Length == 64).FirstOrDefault(); } Id = $"ID {replay.ID} - {replay.GAMETIME.ToString("yyyy/MM/dd")}"; Duration = "Duration " + (TimeSpan.FromSeconds(replay.DURATION).Hours > 0 ? TimeSpan.FromSeconds(replay.DURATION).ToString(@"hh\:mm\:ss") + " h" : TimeSpan.FromSeconds(replay.DURATION).ToString(@"mm\:ss") + " min"); if (pl != null) { Player = "Player #" + pl.REALPOS; } MVP = "MVP #" + replay.DSPlayer.Where(x => x.KILLSUM == replay.MAXKILLSUM).First().REALPOS; Mode = "Mode: " + replay.GAMEMODE.Substring(8); BreakpointMid = new Dictionary <string, double>(DSdata.BreakpointMid); BreakpointMid["ALL"] = replay.DURATION * 22.4; SetMid(replay, _options.GameBreakpoint); _options.GameBreakpoint = "ALL"; foreach (DSPlayer bpl in replay.DSPlayer) { HashSet <string> ups = new HashSet <string>(); Upgrades[bpl.REALPOS] = new Dictionary <string, HashSet <string> >(); Units[bpl.REALPOS] = new Dictionary <string, Dictionary <string, int> >(); List <string> bpdelete = new List <string>(); foreach (var ent in BreakpointMid.OrderBy(o => o.Value)) { if (ent.Value > BreakpointMid["ALL"]) { bpdelete.Add(ent.Key); continue; } ups.UnionWith(GetUpgrades(bpl.Breakpoints.FirstOrDefault(f => f.Breakpoint == ent.Key)).ToHashSet()); Upgrades[bpl.REALPOS][ent.Key] = new HashSet <string>(ups); Units[bpl.REALPOS][ent.Key] = new Dictionary <string, int>(GetUnits(bpl.Breakpoints.FirstOrDefault(f => f.Breakpoint == ent.Key))); } foreach (string dkey in bpdelete) { BreakpointMid.Remove(dkey); } } }
public async Task ChartHandler(DSoptions _options, string thisHandle = null) { await GetChartBase(_options); // rebuild chart // add dataset // remove dataset // change chart options (player, beginatzero) }
public ChartJsoptions GetOptions(DSoptions _options) { ChartJsoptions chartoptions = new ChartJsoptions(); if (_options.Mode == "Synergy" || _options.Mode == "AntiSynergy") { ChartJsoptionsradar radaroptions = new ChartJsoptionsradar(); radaroptions.title.text = _options.Mode + " " + _options.Time; radaroptions.legend.position = "bottom"; if (_options.Player == true) { radaroptions.title.text = "Player " + radaroptions.title.text; } chartoptions = radaroptions; } else { ChartJsoptionsBar baroptions = new ChartJsoptionsBar(); chartoptions = baroptions; ChartJSoptionsScalesY yAxes = new ChartJSoptionsScalesY(); string startdate = _options.Startdate.ToString("yyyy-MM-dd"); string enddate = _options.Enddate.ToString("yyyy-MM-dd"); if (_options.Enddate == DateTime.MinValue) { enddate = DateTime.UtcNow.ToString("yyyy-MM-dd"); } yAxes.scaleLabel.labelString = "% - " + startdate + " - " + enddate + " - " + IsDefaultFilter(_options); if (_options.BeginAtZero == true) { yAxes.ticks.beginAtZero = true; } if (_options.Mode == "Timeline") { baroptions.elements.point = new ChartJSoptionsElementsPoint(); } chartoptions.scales.yAxes.Add(yAxes); } chartoptions.title.display = true; chartoptions.title.text = _options.Mode + " " + _options.Time; if (_options.Player == true) { chartoptions.title.text = "Player " + chartoptions.title.text; } return(chartoptions); }
public async Task RemoveDataset(DSoptions _options, string cmdr, object lockobject) { foreach (ChartJSdataset dataset in _options.Chart.data.datasets.Where(x => x.label.StartsWith(cmdr)).ToArray()) { int pos = _options.Chart.data.datasets.FindIndex(i => i == dataset); if (pos >= 0) { _options.Chart.data.datasets.RemoveAt(pos); await ChartJSInterop.RemoveDataset(_jsRuntime, pos, lockobject); } } //TODO: CmdrInfo info for remaining dataset //TODO?: Check labels and sort //await SortChart(_options.Chart); }
public static string IsDefaultFilter(DSoptions _options) { DSoptions defoptions = new DSoptions(); if (_options.Duration == defoptions.Duration && _options.Army == defoptions.Army && _options.Income == defoptions.Income && _options.Leaver == defoptions.Leaver && _options.Kills == defoptions.Kills && _options.PlayerCount == defoptions.PlayerCount ) { return("default Filter"); } else { return("custom Filter"); } }
public async Task DrawTimeline(DSoptions _options, DataResult dresult, object lockobject) { ChartJSdataset dataset = new ChartJSdataset(); dataset.label = _options.Interest + "_line"; dataset.borderWidth = 3; dataset.pointRadius = 1; ChartService.SetColor(dataset, _options.Chart.type, _options.Interest); dataset.backgroundColor.Clear(); _options.Chart.data.datasets.Add(dataset); ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject).GetAwaiter(); for (int i = 0; i < _options.Chart.data.labels.Count; i++) { ChartJSInterop.AddData(_jsRuntime, _options.Chart.data.labels[i], dresult.fTimeline(i), dresult.Dataset.backgroundColor.Last(), null, lockobject ).GetAwaiter(); } }
public BulkInsert(DSReplayContext context, DSoptions options, DBService db) { _context = context; _options = options; _db = db; }
public static DataResult GetDurations(DSoptions _options, DSReplayContext _context, IJSRuntime _jsRuntime, object lockobject) { if (String.IsNullOrEmpty(_options.Interest)) { return(new DataResult()); } var replays = DBReplayFilter.Filter(_options, _context, false); var result = (_options.Player, _options.Dataset.Any()) switch { (true, false) => from r in replays from p in r.DSPlayer where p.RACE == _options.Interest && p.NAME.Length == 64 select new { r.ID, r.DURATION, p.WIN }, (true, true) => from r in replays from p in r.DSPlayer where p.RACE == _options.Interest && _options.Dataset.Contains(p.NAME) select new { r.ID, r.DURATION, p.WIN }, _ => from r in replays from p in r.DSPlayer where p.RACE == _options.Interest select new { r.ID, r.DURATION, p.WIN } }; var lresult = result.ToList(); if (!lresult.Any()) { return(new DataResult()); } CultureInfo provider = CultureInfo.InvariantCulture; DataResult dresult = new DataResult(); List <double> data = new List <double>(); List <double> xdata = new List <double>(); List <double> ydata = new List <double>(); List <string> labels = new List <string>(); Func <double, double> f = null; int count = lresult.Count; dresult.CmdrInfo.Wins = lresult.Where(x => x.WIN == true).Count(); dresult.CmdrInfo.Games = count; dresult.CmdrInfo.AWinrate = Math.Round((double)dresult.CmdrInfo.Wins * 100 / dresult.CmdrInfo.Games, 2); dresult.CmdrInfo.ADuration = TimeSpan.FromDays(3); dresult.CmdrInfo.GameIDs = lresult.Select(s => s.ID).ToHashSet(); for (int i = 0; i < DSdata.s_durations.Length; i++) { double games = 1; double wins = 0; int startd = 0; if (i > 0) { Match m = d_rx.Match(DSdata.s_durations[i]); if (m.Success) { startd = int.Parse(m.Value); } } int endd = startd + 3; if (i == 0) { endd = 8; } if (i == DSdata.s_durations.Length - 1) { endd = 200; } var ilresult = lresult.Where(x => x.DURATION > startd * 60 && x.DURATION < endd * 60); games = ilresult.Count(); wins = ilresult.Where(x => x.WIN == true).Count(); data.Add(Math.Round(wins * 100 / games, 2)); labels.Add(DSdata.s_durations[i] + " min (" + games + ")"); xdata.Add(i); ydata.Add(data.Last()); } if (xdata.Any() && xdata.Count > 1) { int order = 3; if (xdata.Count <= 3) { if (xdata.Count < 3) { order = 1; } else { order = xdata.Count - 2; } } f = Fit.PolynomialFunc(xdata.ToArray(), ydata.ToArray(), order); } dresult.Labels = labels; dresult.Dataset.data = data; dresult.fTimeline = f; dresult.fStartTime = DateTime.MinValue; ChartService.SetColor(dresult.Dataset, _options.Chart.type, _options.Interest); dresult.Dataset.fill = false; dresult.Dataset.pointRadius = 2; dresult.Dataset.pointHoverRadius = 10; dresult.Dataset.showLine = false; for (int i = 0; i < dresult.Labels.Count; i++) { ChartJSInterop.AddData(_jsRuntime, dresult.Labels[i], dresult.Dataset.data[i], dresult.Dataset.backgroundColor.Last(), null, lockobject ).GetAwaiter(); } if (dresult.fTimeline != null) { ChartJSdataset dataset = new ChartJSdataset(); dataset.label = _options.Interest + "_line"; dataset.borderWidth = 3; dataset.pointRadius = 1; ChartService.SetColor(dataset, _options.Chart.type, _options.Interest); dataset.backgroundColor.Clear(); _options.Chart.data.datasets.Add(dataset); ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject).GetAwaiter(); for (int i = 0; i < dresult.Labels.Count; i++) { double fdata = dresult.fTimeline(i); ChartJSInterop.AddData(_jsRuntime, dresult.Labels[i], fdata, dresult.Dataset.backgroundColor.Last(), null, lockobject ).GetAwaiter(); } } return(dresult); }
public async Task <ChartJS> GetChartBase(DSoptions _options, bool doit = true) { ChartJS mychart = new ChartJS(); List <string> GameModes = _options.Gamemodes.Where(x => x.Value == true).Select(s => s.Key).ToList(); if (GameModes.Contains("GameModeStandard") || GameModes.Contains("GameModeGear") || GameModes.Contains("GameModeSabotage") || GameModes.Contains("GameModeSwitch")) { mychart.s_races_ordered = DSdata.s_races.ToList(); } else { mychart.s_races_ordered = DSdata.s_races_cmdr.ToList(); } mychart.type = "bar"; if (_options.Mode == "Synergy" || _options.Mode == "AntiSynergy") { mychart.type = "radar"; } else if (_options.Mode == "Timeline") { mychart.type = "line"; List <string> _s_races_cmdr_ordered = new List <string>(); DateTime startdate = _options.Startdate; if (startdate == DateTime.MinValue) { startdate = new DateTime(2018, 1, 1); } DateTime enddate = _options.Enddate; if (enddate == DateTime.MinValue) { enddate = DateTime.Now.AddDays(1); } DateTime breakpoint = startdate; while (DateTime.Compare(breakpoint, enddate) < 0) { breakpoint = breakpoint.AddDays(1); _s_races_cmdr_ordered.Add(breakpoint.ToString("yyyy-MM-dd")); } _s_races_cmdr_ordered.RemoveAt(_s_races_cmdr_ordered.Count() - 1); mychart.s_races_ordered = _s_races_cmdr_ordered; } else if (_options.Mode == "Duration") { mychart.type = "line"; mychart.s_races_ordered = new List <string>(DSdata.s_durations); } mychart.options = GetOptions(_options); mychart.s_races = new List <string>(mychart.s_races_ordered); if (doit) { ChartJSdataset dataset = new ChartJSdataset(); if (_options.Mode == "Timeline" || _options.Mode == "Duration") { dataset.fill = false; dataset.pointRadius = 2; dataset.pointHoverRadius = 10; dataset.showLine = false; } if (String.IsNullOrEmpty(_options.Interest)) { dataset.label = "global"; if (_options.Mode == "Synergy" || _options.Mode == "AntiSynergy" || _options.Mode == "Timeline" || _options.Mode == "Duration") { _options.Interest = "Abathur"; dataset.label = _options.Interest; _options.CmdrsChecked["Abathur"] = true; } } else { dataset.label = _options.Interest; } SetColor(dataset, mychart.type, _options.Interest); dataset.backgroundColor.Clear(); mychart.data.datasets.Add(dataset); _options.Chart = mychart; await ChartJSInterop.ChartChanged(_jsRuntime, JsonConvert.SerializeObject(_options.Chart, Formatting.Indented)); DataResult dresult = await DataService.GetData(_options, _context, _jsRuntime, _db.lockobject); if (dresult != null) { _options.Chart.data.labels = new List <string>(dresult.Labels); _options.Chart.data.datasets[0] = dresult.Dataset.DeepCopy(); if (_options.Chart.type == "bar") { var options = _options.Chart.options as ChartJsoptionsBar; options.plugins.labels.images = dresult.Images; } _options.Cmdrinfo = dresult.CmdrInfo; SetCmdrPics(_options.Chart); await ChartJSInterop.ChartChanged(_jsRuntime, JsonConvert.SerializeObject(_options.Chart, Formatting.Indented)); if (dresult.fTimeline != null) { await DrawTimeline(_options, dresult, _db.lockobject); } } await SortChart(_options.Chart); } return(mychart); }
public async Task Init(DSoptions _options) { _options.Chart = await GetChartBase(_options, false); await ChartJSInterop.ChartChanged(_jsRuntime, JsonConvert.SerializeObject(_options.Chart, Formatting.Indented)); }
public async Task AddDataset(DSoptions _options, object lockobject) { ChartJSdataset dataset = new ChartJSdataset(); if (String.IsNullOrEmpty(_options.Interest)) { dataset.label = "global"; } else { dataset.label = _options.Interest; } if (_options.Mode == "Timeline" || _options.Mode == "Duration") { dataset.fill = false; dataset.pointRadius = 2; dataset.pointHoverRadius = 10; dataset.showLine = false; } SetColor(dataset, _options.Chart.type, _options.Interest); dataset.backgroundColor.Clear(); _options.Chart.data.datasets.Add(dataset); await ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject); DataResult dresult = await DataService.GetData(_options, _context, _jsRuntime, _db.lockobject); if (dresult != null) { foreach (string l in _options.Chart.data.labels) { double wr = 0; string bcolor = "rgba(0, 0, 0, 0)"; int ssend = 4; if (_options.Mode == "Timeline") { ssend = 10; } string label = dresult.Labels.FirstOrDefault(s => s.Substring(0, ssend) == l.Substring(0, ssend)); if (!String.IsNullOrEmpty(label)) { int pos = dresult.Labels.FindIndex(i => i == label); _options.Chart.data.datasets.Last().data.Add(dresult.Dataset.data[pos]); if (_options.Chart.type == "line") { _options.Chart.data.datasets.Last().backgroundColor.Add(dresult.Dataset.backgroundColor.Last()); } else { _options.Chart.data.datasets.Last().backgroundColor.Add(dresult.Dataset.backgroundColor[pos]); } wr = dresult.Dataset.data[pos]; if (_options.Chart.type == "line") { bcolor = dresult.Dataset.backgroundColor.Last(); } else { bcolor = dresult.Dataset.backgroundColor[pos]; } } else { _options.Chart.data.datasets.Last().data.Add(0); _options.Chart.data.datasets.Last().backgroundColor.Add("rgba(0, 0, 0, 0)"); } ChartJSInterop.AddData(_jsRuntime, "", wr, bcolor, "", lockobject ); } _options.Cmdrinfo = dresult.CmdrInfo; if (dresult.fTimeline != null) { DrawTimeline(_options, dresult, lockobject); } } }
public static async Task GetBuild(DSoptions _options, DSReplayContext _context, object dblock, ILogger _logger) { if (_options.Vs == "ALL") { _options.Vs = String.Empty; } string Hash = _options.GenHash(); if (!_options.Decoding && BuildCache.ContainsKey(Hash)) { _options.buildResult = BuildCache[Hash]; return; } bool doWait = false; lock (Computing) { if (!Computing.Contains(Hash)) { Computing.Add(Hash); } else { doWait = true; } } if (doWait) { while (Computing.Contains(Hash)) { await Task.Delay(500); } if (BuildCache.ContainsKey(Hash)) { _options.buildResult = BuildCache[Hash]; } return; } BuildResult bresult = new BuildResult(); foreach (var ent in _options.Gamemodes.Keys.ToArray()) { _options.Gamemodes[ent] = false; } if (_options.Interest == "Terran" || _options.Interest == "Zerg" || _options.Interest == "Protoss") { _options.Gamemodes["GameModeStandard"] = true; } else { _options.Gamemodes["GameModeCommanders"] = true; _options.Gamemodes["GameModeCommandersHeroic"] = true; } lock (dblock) { bool mengskfilter = _options.MengskPreviewFilter; _options.MengskPreviewFilter = false; var replays = DBReplayFilter.Filter(_options, _context); _options.MengskPreviewFilter = mengskfilter; bresult.TotalGames = replays.Count(); var presult = (String.IsNullOrEmpty(_options.Vs) switch { true => from r in replays from t1 in r.DSPlayer where t1.RACE == _options.Interest where _options.Dataset.Contains(t1.NAME) from u1 in t1.Breakpoints where u1.Breakpoint == _options.Breakpoint select new { r.ID, r.DURATION, r.GAMETIME, t1.WIN, u1.dsUnitsString, u1.Upgrades, u1.Gas }, false => from r in replays from t1 in r.DSPlayer where t1.RACE == _options.Interest && t1.OPPRACE == _options.Vs where _options.Dataset.Contains(t1.NAME) from u1 in t1.Breakpoints where u1.Breakpoint == _options.Breakpoint select new { r.ID, r.DURATION, r.GAMETIME, t1.WIN, u1.dsUnitsString, u1.Upgrades, u1.Gas } });
public static DataResult GetTimeLine(DSoptions _options, DSReplayContext _context, IJSRuntime _jsRuntime, object lockobject) { if (String.IsNullOrEmpty(_options.Interest)) { return(new DataResult()); } var replays = DBReplayFilter.Filter(_options, _context, false); var result = (_options.Player, _options.Dataset.Any()) switch { (true, false) => from r in replays from p in r.DSPlayer where p.RACE == _options.Interest && p.NAME.Length == 64 select new { r.ID, r.GAMETIME, p.WIN }, (true, true) => from r in replays from p in r.DSPlayer where p.RACE == _options.Interest && _options.Dataset.Contains(p.NAME) select new { r.ID, r.GAMETIME, p.WIN }, _ => from r in replays from p in r.DSPlayer where p.RACE == _options.Interest select new { r.ID, r.GAMETIME, p.WIN } }; var lresult = result.OrderBy(o => o.GAMETIME).ToList(); if (!lresult.Any()) { return(new DataResult()); } CultureInfo provider = CultureInfo.InvariantCulture; DataResult dresult = new DataResult(); List <double> data = new List <double>(); List <double> xdata = new List <double>(); List <double> ydata = new List <double>(); List <string> labels = new List <string>(); Func <double, double> f = null; int count = lresult.Count; int step = 50; int cstep = count / step; while (cstep < 10) { step -= 1; cstep = count / step; if (step <= 1) { break; } } dresult.CmdrInfo.Wins = lresult.Where(x => x.WIN == true).Count(); dresult.CmdrInfo.Games = count; dresult.CmdrInfo.AWinrate = Math.Round((double)dresult.CmdrInfo.Wins * 100 / dresult.CmdrInfo.Games, 2); dresult.CmdrInfo.ADuration = TimeSpan.FromDays(cstep); dresult.CmdrInfo.GameIDs = lresult.Select(s => s.ID).ToHashSet(); for (int i = 0; i < step; i++) { var sreps = lresult.Skip(i * cstep).Take(cstep); if (!sreps.Any()) { continue; } data.Add(Math.Round((double)sreps.Where(x => x.WIN == true).Count() * 100 / (double)sreps.Count(), 2)); labels.Add(sreps.Last().GAMETIME.ToString("yyyy-MM-dd")); xdata.Add(i); ydata.Add(data.Last()); } if (xdata.Any() && xdata.Count > 1) { int order = 6; if (xdata.Count <= 6) { if (xdata.Count < 3) { order = 1; } else { order = xdata.Count - 2; } } f = Fit.PolynomialFunc(xdata.ToArray(), ydata.ToArray(), order); } dresult.Labels = labels; dresult.Dataset.data = data; dresult.fTimeline = f; dresult.fStartTime = lresult.First().GAMETIME; ChartService.SetColor(dresult.Dataset, _options.Chart.type, _options.Interest); dresult.Dataset.fill = false; dresult.Dataset.pointRadius = 2; dresult.Dataset.pointHoverRadius = 10; dresult.Dataset.showLine = false; for (int i = 0; i < dresult.Labels.Count; i++) { ChartJSInterop.AddData(_jsRuntime, dresult.Labels[i], dresult.Dataset.data[i], dresult.Dataset.backgroundColor.Last(), null, lockobject ).GetAwaiter(); } if (dresult.fTimeline != null) { string fstart = dresult.Labels.First().Substring(0, 10); DateTime ffstart = DateTime.ParseExact(fstart, "yyyy-MM-dd", provider); ChartJSdataset dataset = new ChartJSdataset(); dataset.label = _options.Interest + "_line"; dataset.borderWidth = 3; dataset.pointRadius = 1; ChartService.SetColor(dataset, _options.Chart.type, _options.Interest); dataset.backgroundColor.Clear(); _options.Chart.data.datasets.Add(dataset); ChartJSInterop.AddDataset(_jsRuntime, JsonConvert.SerializeObject(dataset, Formatting.Indented), lockobject).GetAwaiter(); for (int i = 0; i < dresult.Labels.Count; i++) { double fdata = dresult.fTimeline(i); ChartJSInterop.AddData(_jsRuntime, dresult.Labels[i], fdata, dresult.Dataset.backgroundColor.Last(), null, lockobject ).GetAwaiter(); } } return(dresult); }
public static IQueryable <DSReplay> Filter(DSoptions options, DSReplayContext context, bool isFiltered = false, IQueryable <DSReplay> ireps = null) { var replays = ireps; if (replays == null) { replays = context.DSReplays .Include(p => p.DSPlayer) .Where(x => x.WINNER >= 0) ; } HashSet <string> Gamemodes = options.Gamemodes.Where(x => x.Value == true).Select(y => y.Key).ToHashSet(); IQueryable <DSReplay> filReplays; if (isFiltered == false) { if (String.IsNullOrEmpty(options.Interest)) { if (options.Leaver > 0) { filReplays = replays .Where(x => x.DURATION > options.Duration) .Where(x => x.MAXLEAVER < options.Leaver) .Where(x => x.MINARMY > options.Army) .Where(x => x.MININCOME > options.Income) .Where(x => x.MINKILLSUM > options.Kills) .Where(x => x.PLAYERCOUNT >= options.PlayerCount) .Where(x => Gamemodes.Contains(x.GAMEMODE)) //.ToArray() ; } else { filReplays = replays .Where(x => x.DURATION > options.Duration) .Where(x => x.MINARMY > options.Army) .Where(x => x.MININCOME > options.Income) .Where(x => x.MINKILLSUM > options.Kills) .Where(x => x.PLAYERCOUNT >= options.PlayerCount) .Where(x => Gamemodes.Contains(x.GAMEMODE)) //.ToArray() ; } } else if (options.Leaver > 0) { filReplays = replays .Where(x => x.DURATION > options.Duration) .Where(x => x.MAXLEAVER < options.Leaver) .Where(x => x.MINARMY > options.Army) .Where(x => x.MININCOME > options.Income) .Where(x => x.MINKILLSUM > options.Kills) .Where(x => x.PLAYERCOUNT >= options.PlayerCount) .Where(x => Gamemodes.Contains(x.GAMEMODE)) .Where(x => x.DSPlayer.FirstOrDefault(s => s.RACE == options.Interest) != null) //.ToArray() ; } else { filReplays = replays .Where(x => x.DURATION > options.Duration) .Where(x => x.MINARMY > options.Army) .Where(x => x.MININCOME > options.Income) .Where(x => x.MINKILLSUM > options.Kills) .Where(x => x.PLAYERCOUNT >= options.PlayerCount) .Where(x => Gamemodes.Contains(x.GAMEMODE)) .Where(x => x.DSPlayer.FirstOrDefault(s => s.RACE == options.Interest) != null) //.ToArray() ; } } else { filReplays = replays; } if (options.Startdate != default(DateTime)) { filReplays = filReplays.Where(x => x.GAMETIME >= options.Startdate); } if (options.Enddate != default(DateTime)) { filReplays = filReplays.Where(x => x.GAMETIME <= options.Enddate.AddDays(1)); } if (DSdata.IsMySQL) { if (options.MengskPreviewFilter) { var testReplays = from r in filReplays from p in r.DSPlayer where p.RACE == "Mengsk" && r.GAMETIME < new DateTime(2020, 07, 28, 5, 23, 0) select r.ID; filReplays = filReplays.Where(x => !testReplays.Contains(x.ID)); } if (options.Dataset.Any()) { filReplays = filReplays .Where(x => x.DSPlayer.Select(s => s.NAME).Contains(options.Dataset.First())); } } return(filReplays); }