Linq to entities-как выбрать сущности с условием where на их entitycollection?


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

У меня есть сущность под названием "Компания", внутри которой у меня есть entityCollection" сотрудники " (один ко многим). Мне нужно восстановить все компании, и для каждой из них я хочу только сотрудников с возрастом больше 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.Компания " не может быть построена в запросе LINQ к сущностям.

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

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


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

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

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


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

3 2

3 ответа:

Нет никакого способа иметь "условную нетерпеливую загрузку" с включением в LINQ к сущностям. Однако существует 2 способа решения. Первый-это фильтрованная проекция и это тот, который предложил Джастин, но не может быть желательным во всех ситуациях, поскольку он дает коллекцию анонимных объектов типа.

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

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

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

Вместо использования типа 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 Types в VB.NET)

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

Return context.Employee.Include("Company").Where(e => e.Age > 21)