diff --git a/src/MapsDb/DataService/AuthorityDs.cs b/src/MapsDb/DataService/AuthorityDs.cs index 047e163..7a54ffa 100644 --- a/src/MapsDb/DataService/AuthorityDs.cs +++ b/src/MapsDb/DataService/AuthorityDs.cs @@ -30,6 +30,8 @@ namespace MapsDb.DataService .Include(d=>d.Road) .Include(d=>d.CrossSection); + data = Filtering(pagination.filter, data); + IQueryable result = data .Select(Authority => Mapper.Map(Authority)) .Skip(pagination.from) @@ -81,5 +83,86 @@ namespace MapsDb.DataService _context.Authority.Remove(authority); return await _context.SaveChangesAsync(); } + public IQueryable Filtering(string filters, IQueryable data){ + if(filters != null){ + string[] FilterWords = filters.Split(';').Where(x => !string.IsNullOrEmpty(x)).ToArray(); + foreach(string word in FilterWords){ + string[] filter = Regex.Split(word.Substring(1), "(.*)_(.*)"); + if(filter.Length < 3 ){ + continue; + } + string field = char.ToUpper(filter[1][0]) + filter[1].Substring(1); + string param = filter[2].ToLower(); + if(word.StartsWith("$")){ + data = FilterByEndWith(field, param, data); + } + else if(word.StartsWith("^")){ + data = FilterByStartWith(field, param, data); + } + else if(word.StartsWith("*")){ + data = FilterByComtains(field, param, data); + } + else if(word.StartsWith("!")){ + data = FilterByNotEquals(field, param, data); + } + else if(word.StartsWith("=")){ + data = FilterByEquals(field, param, data); + } + } + + } + return data; + } + public IQueryable FilterByComtains(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower().Contains(param) ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower().Contains(param) ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower().Contains(param) ); + } + } + public IQueryable FilterByEquals(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Id.ToString().ToLower() == param ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower() == param ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower() == param ); + } + + } + public IQueryable FilterByNotEquals(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower() != param ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower() != param ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower() != param ); + } + } + public IQueryable FilterByStartWith(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower().StartsWith(param) ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower().StartsWith(param) ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower().StartsWith(param) ); + } + } + public IQueryable FilterByEndWith(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower().EndsWith(param) ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower().EndsWith(param) ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower().EndsWith(param) ); + } + } } } \ No newline at end of file diff --git a/src/MapsDb/DataService/ContractorDs.cs b/src/MapsDb/DataService/ContractorDs.cs index c3368d4..4c7547c 100644 --- a/src/MapsDb/DataService/ContractorDs.cs +++ b/src/MapsDb/DataService/ContractorDs.cs @@ -30,6 +30,8 @@ namespace MapsDb.DataService .Include(d=>d.Road) .Include(d=>d.CrossSection); + data = Filtering(pagination.filter, data); + IQueryable result = data .Select(Contractor => Mapper.Map(Contractor)) .Skip(pagination.from) @@ -81,5 +83,86 @@ namespace MapsDb.DataService _context.Contractor.Remove(contractor); return await _context.SaveChangesAsync(); } + public IQueryable Filtering(string filters, IQueryable data){ + if(filters != null){ + string[] FilterWords = filters.Split(';').Where(x => !string.IsNullOrEmpty(x)).ToArray(); + foreach(string word in FilterWords){ + string[] filter = Regex.Split(word.Substring(1), "(.*)_(.*)"); + if(filter.Length < 3 ){ + continue; + } + string field = char.ToUpper(filter[1][0]) + filter[1].Substring(1); + string param = filter[2].ToLower(); + if(word.StartsWith("$")){ + data = FilterByEndWith(field, param, data); + } + else if(word.StartsWith("^")){ + data = FilterByStartWith(field, param, data); + } + else if(word.StartsWith("*")){ + data = FilterByComtains(field, param, data); + } + else if(word.StartsWith("!")){ + data = FilterByNotEquals(field, param, data); + } + else if(word.StartsWith("=")){ + data = FilterByEquals(field, param, data); + } + } + + } + return data; + } + public IQueryable FilterByComtains(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower().Contains(param) ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower().Contains(param) ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower().Contains(param) ); + } + } + public IQueryable FilterByEquals(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Id.ToString().ToLower() == param ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower() == param ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower() == param ); + } + + } + public IQueryable FilterByNotEquals(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower() != param ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower() != param ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower() != param ); + } + } + public IQueryable FilterByStartWith(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower().StartsWith(param) ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower().StartsWith(param) ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower().StartsWith(param) ); + } + } + public IQueryable FilterByEndWith(string field, string param, IQueryable data){ + switch(field){ + case "RoadId": + return data.Where(i => i.Road.Name != null && i.Road.Name.ToLower().EndsWith(param) ); + case "CrossSectionId": + return data.Where(i => i.CrossSection.Id.ToString().ToLower().EndsWith(param) ); + default: + return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).ToLower().EndsWith(param) ); + } + } } } \ No newline at end of file -- libgit2 0.21.4