Линк к сущностям - как выбрать сущности с условием где их совокупность сущностей? - PullRequest
2 голосов
/ 12 октября 2010

Я несколько раз встречал людей, спрашивающих об одном и том же вопросе, но кажется, что ответ никогда не был удовлетворительным, хотя это должно быть довольно легко (теоретически).Вот мой вопрос:

У меня есть сущность под названием «Компания», внутри которой у меня есть сущностьКоллекция «Сотрудники» (один ко многим).Мне нужно получить все компании, и для каждой из них мне нужны только сотрудники с возрастом, превышающим 21.

Я пытался:

Return context.Companies.Include("Employees").Where(c => c.Employees.Where(e => e.Age > 21).Count() > 0)

Это не работает, поскольку даетЯ все сотрудники для каждой компании, если есть хотя бы один выше 21 (на самом деле это то же самое, что .Any ())

Я пытался:

Return context.Companies.Include("Employees").Select(c => New Company {  
.Id = c.Id, 
.Employees = c.Employees.Where(Function(e) e.Age > 24)
}).ToList()

Это тоже не сработало(хотя это было бы идеально), это дает мне следующую ошибку: Сущность или сложный тип 'MyModel.Company' не могут быть созданы в запросе LINQ to Entities.

Как можноВы выбираете все мои компании, в которых для каждой из них работают сотрудники старше 21 года?На данный момент я выбираю все и на стороне клиента я фильтрую своих сотрудников, но мне не нравится это решение.

Кто-нибудь может мне помочь?


Спасибо, Мортеза Манави-Параст, он будет работать!

Тем не менее, я с трудом убеждаю себя, что выполнение в уникальном запросе не реализовано в платформе Entity.Это довольно распространенная ситуация ... Как доказательство, на этом форуме есть множество вопросов, подобных моему.

Я удивлен ... Может быть, для следующего выпуска?


Чтобы было ясно, мне нужен список компаний, поскольку я напрямую связываю результат моего запроса с сеткой данных.Для вашей информации, когда я щелкаю по строке моей таблицы данных (выбирая компанию), у меня появляется вторая таблица, в которую входят ее сотрудники (старше 21 года) из entityCollection.

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Не существует способа «условной загрузки» с включением в LINQ to Entities.Существует 2 обходных пути, хотя.Первый из них - Filtered Projection , и именно он предложил Джастин, но может быть нежелателен во всех ситуациях, поскольку он дает коллекцию объектов анонимного типа.

Второй способ называется Два отслеживаемых запроса , который дает вам набор типов компаний, чьи сотрудники удовлетворяют условию, и я считаю, что это то, что вы ищете,Вот код для этого:

var companies = context.Companies.ToList();
var employees = context.Employee.Where(e => e.Age > 21);
foreach (var employee in employees) {
   companies.Single(c => c.CompanyID == employee.CompanyID).Employees.Add(employee);
}

Пожалуйста, взгляните на Условная загрузка Eager для другого примера.

2 голосов
/ 12 октября 2010

Вместо того, чтобы использовать тип Company, вы пытались выбрать новый анонимный тип:

Return context.Companies.Include("Employees").Select(c => New With {
    .Id = c.Id,
    .Employees = c.Employees.Where(Function(e) e.Age > 24)
}).ToList()

(Извините, если синтаксис немного не работает, прошло некоторое время, так как я сделал LINQ / AnonymousТипы в VB.NET)

1 голос
/ 12 октября 2010

Возможно, вы слишком обдумываете это.Если у вас есть отношения Company => Employee с двусторонним отображением, просто сделайте выбор по Employee с предложением where и включите company.

...