Вы можете попробовать, предполагая, что у вас уже есть заданная переменная переменнаяCountry и значение:
int total = EntityModel.CitySet.Where( it => it.State.Country.ID == givenCountry.ID ).Count();
Выше вы берете весь свой набор городов (EntityMode.CitySet). Этот набор содержит все города во всех штатах во всех странах. Возникает проблема: какое подмножество этих городов находится в стране «данной стране»? Чтобы выяснить это, вы применяете Where () ко всему набору и сравниваете идентификаторы стран, чтобы увидеть, совпадают ли они. Однако, поскольку город знает только, в каком штате он находится (а не в стране), сначала необходимо указать его состояние (it.State). it.State ссылается на объект состояния, и этот объект имеет свойство Country, которое будет ссылаться на страну. Затем it.State.Country ссылается на страну, в которой он находится, а it - город, создавая связь между городом и страной.
Обратите внимание, что вы могли бы сделать это наоборот также с
int total = givenCountry.Sum( c => c.States.Sum( s.Cities.Count() ) )
Однако здесь вам необходимо убедиться, что в GivenCountry коллекция состояний загружена в память, а также в каждом штате загружена коллекция городов. Это связано с тем, что вы используете Linq-to-Entities для загруженного объекта, а не для объекта экземпляра Entity Framework, как в первом примере. Однако есть способ создать последний запрос для использования объекта инфраструктуры сущностей:
int total = EntityModel.CountrySet.Where( c => c.ID == givenCountry.ID ).Sum( c => c.States.Sum( s.Cities.Count() ) )
Что касается количества городов с определенным полем, вы применяете аналогичный подход с вызовом Where ():
int filtered = EntityModel.CitySet.Where( it => it.field == value ).Count();