所以,我从我的数据库中检索了一堆国家:
var countries = dbContext.Countries.toList();
然后,根据程序流程,我进一步过滤这些贡献:
var asianContries = result.where(c=>c.continent == "asia").toList();
"我的国家/地区"表是"城市"表的"父"表,每个城市与一个国家/地区相关。城市表包含人口信息,我想进一步过滤这些信息。
我想要从已经过滤的"亚洲国家"列表对象中,列出人口超过 500,000 的城市的国家/地区列表。我只是冷酷地试图弄清楚该怎么做。另外,我是这些东西的新手。
为什么使用这种多步骤过滤而不是一次性选择所有条件?程序流的复杂性。说来话长。:-)
理解正确,您已经过滤到亚洲国家/地区,现在您想进一步过滤这些结果。如果您将人口作为 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();
我认为这应该有效。
连接多个表的示例,
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
};
您可以在此处参考如何连接多个表
>如果对象实现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();