using System; using System.Linq; using LeafWeb.Core.Entities; using LeafWeb.WebCms.Models; namespace LeafWeb.WebCms.Utility { internal static class QueryFilter { public static IQueryable Search(IQueryable resultItems, LeafDataQuery query) { // search functionality if (!string.IsNullOrEmpty(query.q)) { foreach (var piece in query.q.Split(' ').Select(p => p.Trim())) { resultItems = from li in resultItems where li.Name.Contains(piece) || li.Identifier.Contains(piece) || li.SiteId.Contains(piece) select li; } } if (!string.IsNullOrEmpty(query.species)) { resultItems = from li in resultItems where li.LeafInputData.Any(lid => lid.MajorSpecies.Contains(query.species)) select li; } if (!string.IsNullOrEmpty(query.siteid)) { resultItems = from li in resultItems where li.SiteId.Contains(query.siteid) select li; } if (!string.IsNullOrEmpty(query.lat)) { var latitude = int.Parse(query.lat); var range = 0; if (!string.IsNullOrEmpty(query.latr)) { range = int.Parse(query.latr); } resultItems = from li in resultItems where li.LeafInputData.Any(lid => lid.Site.Latitude >= latitude - range && lid.Site.Latitude <= latitude + range) select li; } if (!string.IsNullOrEmpty(query.lon)) { var longitude = int.Parse(query.lon); var range = 0; if (!string.IsNullOrEmpty(query.lonr)) { range = int.Parse(query.lonr); } resultItems = from li in resultItems where li.LeafInputData.Any(lid => lid.Site.Longitude >= longitude - range && lid.Site.Longitude <= longitude + range) select li; } // co2s if (!string.IsNullOrEmpty(query.co2s)) { var p = double.Parse(query.co2s); resultItems = from li in resultItems where // maximum range inside LeafInputFiles li.LeafInputData.Max(lid => // range of LeafInputData lid.Data.Max(d => d.CO2S) - lid.Data.Min(d => d.CO2S)) >= p select li; } return resultItems; } } }