选择符合特定条件的孩子的父母

时间:2019-01-16 11:37:16

标签: c# entity-framework

因此,我从数据库中检索了一些国家:

var countries = dbContext.Countries.toList();

然后,根据程序流程,我将进一步过滤以下Contries:

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

“我的国家”表是“城市”表的“父”表,每个城市都与一个国家相关。 “城市”表包含人口信息,我希望进一步对其进行过滤。

我想从已经过滤的“ asianCountries”列表对象中,选择一个国家列表,其中有人口超过500,000的城市。我只是想知道如何去做而已。另外,我是新手。

为什么这种多步骤过滤而不是一口气选择所有标准?程序流程的复杂性。很长的故事。 :-)

3 个答案:

答案 0 :(得分:2)

如果我正确理解您的信息,现在您已过滤到亚洲国家/地区,则希望进一步过滤这些结果。 如果您的人口为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();

我认为这应该有效。

答案 1 :(得分:1)

连接多个表的示例,

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
                     };

您可以参考如何连接多个表here

答案 2 :(得分:1)

如果对象实现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();