Получить граф вложенных объектов
Я пытаюсь получить количество сотрудников в определенном состоянии в LINQ.
У меня есть что-то вроде этого:
States
|
Cities
|
Posts
|
Employees
Как я могу получить Employees
счет выбранным State
в руке?
Мои объекты:
public class Province : EntityBase
{
public String ProvinceName { get; set; }
public virtual IList<City> Cities { get; set; }
}
public class City : EntityBase
{
public String CityName { get; set; }
public virtual Province Province { get; set; }
public virtual IList<Post> ElectricPosts { get; set; }
}
public class Post : EntityBase
{
public String PostName { get; set; }
public virtual City City { get; set; }
public virtual IList<Employee> Employees { get; set; }
}
public class Employee : Person
{
public virtual String FirstName { get; set; }
public virtual String SureName { get; set; }
public virtual Post ElectricPost { get; set; }
}
Изменить: Интересно, что я могу получить счет Posts
без каких-либо проблем и исключений, но когда я хочу попробовать путь в сообщении @HamletHakobyan, я получаю NullReferenceException
и Я не знаю почему?
Ответы
Ответ 1
Я не уверен, но попробую:
var state = ((IObjectContextAdapter)context)
.ObjectContext
.CreateObjectSet<Province>("States") as ObjectQuery<Province>;
// States is entitySetName
int count = state.Cities.Include("ElectricPosts.Employees")
.SelectMany(c => c.Posts)
.SelectMany(p => p.Employees)
.Count();
Ответ 2
Для этого можно использовать методы LINQ to Entities Sum
и Count
:
int count = db.States
.Where( state => state.StateId == X )
.Sum( state => state.Cities
.Sum( city => city.Posts
.Sum( post.Employees.Count() )
)
)
;
Ответ 3
var q = from emp in dc.Employees
from post in dc.Posts
from city in dc.Cities
from state in dc.States
where emp.PostID == post.ID
&& post.CityID == city.ID
&& city.StateID == state.ID
&& state.Name == "Tehran"
select emp;
или просто
var q = from emp in dc.Employees
where emp.Post.City.State.Name == "Tehran"
q - это список сотрудников этого состояния, и теперь вы можете легко их подсчитать (я уверен, вы знаете, как их подсчитать).
Ответ 4
Это было бы моим решением для вашей проблемы, если бы я правильно и правильно
потому что я не смог найти способ придерживаться этого 4 Linq вместе, но, возможно, вы сможете это сделать
кстати, если вам понадобится дополнительный, посмотрите на ссылку
var list = new List<Province>();
string sProvinceName = "";
string sCityName = "";
string sPostName = "";
string sEmployeeFirstName = "";
string sEmployeeSureName = "";
var iListListcitys = from province in list
where province != null
where province.Cities != null
where province.ProvinceName == sProvinceName
select province.Cities;
var iListListposts = from icitys in iListListcitys
from city in icitys
where city != null
where city.ElectricPosts != null
where city.CityName == sCityName
select city.ElectricPosts;
var iListListEmployees = from posts in iListListposts
from post in posts
where post != null
where post.Employees != null
where post.PostName == sPostName
select post.Employees;
var listEmployees = from employees in iListListEmployees
from employee in employees
where employee != null
where employee.FirstName == sEmployeeFirstName || employee.SureName == sEmployeeSureName
select employee;
var count = listEmployees.Count();
Ответ 5
У меня была точно такая же проблема (вопрос), но, к сожалению, решения, которые я нашел в Интернете другими, были неправильными! Поэтому я попытался решить эту проблему.
Итак, предположим, что у нас есть некоторые страны, в каждой стране есть несколько государств, и у каждого государства есть несколько городов, и мы хотим, чтобы некоторые страны рассматривали модели, в которых есть идентификатор и название каждой страны, а также граф всех штатов и всех городов принадлежат каждой стране. Решение находится ниже:
var varResult =
OurDatabaseContext.Countries
.Select(current => new {
Id = current.Id,
Name = current.Name,
StateCount = current.States.Count,
CityCount = current.States.Count == 0 ? 0 :
current.States.Select(state =>
new { CityCount = state.Cities.Count }).Sum(q => q.CityCount)
};
Ответ 6
db.States.Where(p => p.yourcondition == whatever).Cities.Posts.Employees.Count()
Ответ 7
Попробуйте следующее:
Province province = ...;
int count = province.Cities.Include(c => c.Posts.Select(p => p.Employees))
.Where(c => c != null)
.SelectMany(c => c.Posts)
.Where(p => p != null)
.SelectMany(p => p.Employees)
.Where(e => e != null)
.Count();
Затем удалите предложения .Where
один за другим, чтобы найти проблемное место.
Вы также можете использовать join
s:
int count = (from c in province.Cities
join p in db.Posts on c equals p.City
join e in db.Employees on p equals e.ElectricPost
select e).Count();
Ответ 8
var cites = (from s in _db.Province where s.ProvinceName == 'name' select s.Cities);
int count = (from p in _db.Posts
where city.Contains(p.City)
select p.Employees).Count();