2011-01-31 3 views
5

Этот запрос возвращает идентификатор сотрудника, имя, фирменный номер, название компании и город компании. Мне не хватает адреса электронной почты сотрудника (адрес электронной почты, хранящийся в таблице EmployeeEmailAddress) и номера телефонов сотрудников (номер телефона, хранящийся в таблице EmployeePhoneNumbers)..SelectMany() и получение данных из более чем одной связанной таблицы

Мне нужно было добавить .SelectMany(), чтобы получить отношения с родительской компанией и получить доступ к идентификатору компании, имени и городу. Однако теперь я не могу получить доступ к каким-либо свойствам, не найденным в таблице PersonOrgMap. Я не могу перейти к другим таблицам. Удаление .SelectMany() позволяет мне перемещаться по другим таблицам, но я теряю доступ к информации о родительской компании.

var employees = Contacts.Where(c => c.ContactAttributes 
.Any (ca => ca.AttributeID == 1153)) 
.SelectMany (x => x.ChildPersonOrgMaps) 
.Select (c => new { employeeId = c.Child.ContactID, 
      c.Child.FirstName, 
      c.Child.LastName, 
      companyId = c.ParentContactID, 
      c.Parent.OrganizationName, 
      c.Parent.City 
     } 
     ) 
.OrderBy (c =>c.LastName).ThenBy(x => x.FirstName) 
.Dump(); 

ответ

5

Здесь выражения запроса действительно помогают. Если запустить запрос, как это:

from c in Contacts 
where c.ContactAttributes.Any (ca => ca.AttributeID == 1153)) 
from om in c.ChildPersonOrgMaps 
... 

вы будете иметь доступ к обоим с и ом переменных позже в запросе. C# переводит это в вызов SelectMany, выбирая временный анонимный тип, который «несет» исходную переменную. Лучший способ увидеть это - написать запрос как выражение запроса в LINQPad, а затем просмотреть вкладку лямбда, чтобы увидеть перевод в свободный синтаксис.

+4

+1 для бесстыдного LINQPad plug ;-) Очень хороший продукт! – DenaliHardtail

0

Я согласен с Joe Albahari - используйте синтаксис запроса. Это одно (что я знаю), что вы можете делать с запросом, который не может быть с синтаксисом метода.

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

var employees = Contacts.Where(c => c.ContactAttributes 
.Any (ca => ca.AttributeID == 1153)) 
.SelectMany (x => new { Parent = x, Child = x.ChildPersonOrgMaps }) 
// etc 
16

Если вы заинтересованы в синтаксисе методы, то есть перегрузка на SelectMany(), который также предоставляет доступ к как «источнику» и «результат» объекты:

.SelectMany(x => x.ChildPersonOrgMaps, (x, c) => new { x, c }) 
.Select(xc => new 
{ 
    xc.x.Attribute1, 
    xc.x.Attribute2, 
    xc.c.Child.Attribute3, 
    xc.c.Attribute4 
}); 
Смежные вопросы