Выбор родителей детей, которые соответствуют определенным критериям - PullRequest
0 голосов
/ 16 января 2019

Итак, я получил несколько стран из моей базы данных:

var countries = dbContext.Countries.toList();

Затем, в зависимости от выполнения программы, я отфильтрую следующие данные:

var asianContries = result.where(c=>c.continent == "asia").toList();

Таблица «Мои страны» является «родительской» таблицей в таблице «Города», где каждый город относится к стране. Таблица городов содержит информацию о населении, которую я хочу отфильтровать.

Я хочу из уже отфильтрованного объекта списка «asianCountries» список стран, в которых есть города с населением более 500 000 человек. Я просто застыл, пытаясь понять, как это сделать. Кроме того, я новичок в этом деле.

Почему эта многоступенчатая фильтрация вместо выбора по всем критериям за один раз? Сложность программного потока. Длинная история. : -)

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Если объект реализует IQueryable<T>, запрос выполняется только при перечислении объекта. Это означает, что вы можете объединять запросы в цепочку, и выполнение будет отложено до тех пор, пока вы не вызовете, например, ToList().

В вашем примере вы могли бы сделать что-то вроде:

// to select the cities
var largeCities = dbContext.Countries
                           .Include(t => t.Cities)
                           .Where(c=> c.continent == "asia" 
                                  && c.Cities.Population > 500000)
                           .Select(c => c.Cities).ToList();

// EDIT
// to select the countries that have these cities
var countries = dbContext.Countries
                           .Include(t => t.Cities)
                           .Where(c=> c.continent == "asia" 
                                  && c.Cities.Population > 500000)
                           .ToList();  // remove .Select(c => C.Cities) if you want the countries

Или

var largeCities = asianCountries
                       .Where(c => c.Cities.Population > 500000)
                       .Select(c => c.Cities)
                       .ToList();
0 голосов
/ 16 января 2019

Если я правильно понял, вы уже отфильтровали страны Азии, и вы хотите отфильтровать эти результаты дальше.Я бы сделал это одним из двух способов, если бы у вас было население типа int

var cities = asianCountries.Select(x => x.cities.Where( y => y.population > 500000)).ToList();

, если это строка, то

var cities = asianCountries.Select(x => x.cities.Where(y => Convert.ToInt32(y.population) > 500000)).ToList();

Это должно работать, я думаю.

0 голосов
/ 16 января 2019

Пример объединения нескольких таблиц,

from ct in dbContext.Countries
          join ci in dbContext.Cities on ct.CityID equals ci.ID
          where (ct.continent == "asia") && (ci.Population == // yourCondition) 
          select new { country = ct.Name, city = ci.Name , // other fields you want to select
                     };

Вы можете взять справку о том, как объединить несколько таблиц здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...