И запрос LINQ на 3 разных списков - PullRequest
0 голосов
/ 25 ноября 2010

Мне нужно запросить список с 3 различными строковыми входами. Входные строки имеют вид string1|string2|string3. Поэтому мне нужно разделить их split('|') раньше.

Теперь мне нужно запросить список (Locations<Location>()), сравнивая значения из 3 различных массивов (country[], state[], city[]), полученных при разбиении строк.

У меня есть запрос linq для каждого следующим образом

Пример: для соответствия стране

IEumerable<Location> loc =  Locations.Where(lc=> Country.Any(entry => lc.CountryName.   StartsWith(entry,StringComparison.OrdinalIgnoreCase)));

Мне нужно пропустить проверку состояния, если строка состояния пуста. Поэтому мое решение было:

  1. Запрос страны в первую очередь. если строка пуста, вернуть исходный список ввода.

  2. Запрос состояний по результату, полученному из шага выше. если строка пуста, вернуть исходный список ввода.

  3. Запрос города на результат, полученный из шага выше. если строка пуста, вернуть исходный список ввода.

Есть ли способ объединить все 3 в один запрос LINQ, учитывая проблему выше ?. Надеюсь, я был чист.

Текущий код с ожидаемым выводом

 private IList<Location> FilterLocation(
     IList<Location> locations, LocationRequest Request)
 {
     locations = FindCountry(locations, Request.Countries);
     locations = FindStatenames(locations, Request.States);
     locations =FindCitynames(locations, Request.Cities);

     return locations;
 }

 private IList<Location> FindCountry(
     IList<Location> locations, string Countrynames)
 {
     if (!string.IsNullOrEmpty(Countrynames))
     {        
         string[] Country= Countrynames.Split('|');
         IEnumerable<Study> result = locations.Where(lc=> Country.Any(entry => lc.CountryName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)));

         return result.ToList();
     }
     return locations;
 }

 private IList<Location> FindStatenames(
     IList<Location> locations, string Statenames)
 {             
     if (!string.IsNullOrEmpty(Statenames))
     {
         string[] States =Statenames.Split('|');
         IEnumerable<Study> result = locations.Where(lc=> States.Any(entry => lc.StateName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)));

         return result.ToList();                                                       
     }
     return locations;
 }

 private IList<Location> FindCitynames(
     IList<Location> locations, string Citynames)
 {
     if (!string.IsNullOrEmpty(Citynames))
     {
         string[] Cities = Citynames.Split('|');
         IEnumerable<Study> result = locations.Where(lc=> Cities.Any(entry => lc.CityName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)));

         return result.ToList();
     }
     return locations;
 }

Пример вывода

     First Sample
        Input
        Countrynames = "Country1|Country2|Country3"
        Statenames = "State1|State2|State3"
        Citynames = "City1|City2|City3"

        Output
        Match Location with Country2,State1,City3

     Second Sample
       Input
        Countrynames = null
        Statenames = "State1|State2|State3"
        Citynames = "City1|City2|City3"
       Output
        Match Location with Country2,State1,City3         
        Match Location with Country10,State1,City3
        Match Location with Country15,State1,City3
        Match Location with Country8,State1,City3

Другими словами if Countrynames = null Не включать в поиск. if Statenames = null Не включать в поиск. if Citynames = null Не включать в поиск.

Заранее спасибо.

1 Ответ

0 голосов
/ 25 ноября 2010

Вы не совсем понятны, но звучит так, будто вы хотите что-то вроде этого:

IEumerable<Location> loc = Locations.Where(lc =>
    (CountryList == "" || Country.Any(entry => lc.CountryName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)))
 && (StateList == "" || State.Any(entry => lc.StateName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)))
 && (CityList == "" || City.Any(entry => lc.CityName.StartsWith(entry,StringComparison.OrdinalIgnoreCase))));

Вот мое переписывание вашей функции:

private IList<Location> FilterLocation( 
    IList<Location> locations, LocationRequest request) 
{
    string[] countryList, stateList, cityList;
    if (!string.IsNullOrEmpty(request.Country))
        countryList = request.Country.Split("|");
    if (!string.IsNullOrEmpty(request.State))
        stateList = request.State.Split("|");
    if (!string.IsNullOrEmpty(request.City))
        cityList = request.City.Split("|");

    return locations.Where(lc =>
        (countryList == null || countryList.Any(entry => lc.CountryName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)))
     && (stateList == null || stateList.Any(entry => lc.StateName.StartsWith(entry,StringComparison.OrdinalIgnoreCase)))
     && (cityList == null || cityList.Any(entry => lc.CityName.StartsWith(entry,StringComparison.OrdinalIgnoreCase))))
        .ToList();
} 
...