Вы должны иметь ассоциаций между Message
и Person
. Поскольку дизайнер EF создает их автоматически, вы, вероятно, уже это делаете. Однако, поскольку они будут генерироваться из внешних ключей, а не из имен столбцов, автоматически созданные ассоциации, вероятно, были созданы с менее чем полезными именами, такими как Message.Person1
или чем-то еще. Вы можете выбрать их в конструкторе и переименовать в более полезное имя.
Давайте предположим, что ваши ассоциации называются Message.FromPerson
и Message.ToPerson
. После этого вы сможете писать запросы вроде:
var messages = from m in _entities.Message
select new BizObjects.Message
{
MessageId = m.MessageId,
From = new BizObjects.Person
{
PersonId = m.FromPerson.PersonId,
PersonName = m.FromPerson.PersonName
},
To = new BizObjects.Person
{
PersonId = m.ToPerson.PersonId,
PersonName = m.ToPerson.PersonName
},
Subject = m.Subject,
Content = m.Content,
Read = m.Read,
CreatedOn = m.CreatedOn,
};
Используя свойства ассоциации в моем запросе LINQ to Entities, я заставляю Entity Framework транслитерировать эту ссылку в LEFT OUTER JOIN
в SQL.
Это очень эффективный способ загрузки данных (особенно в отличие от отложенной загрузки, которая вызывает несколько запросов к базе данных для слишком большого числа столбцов), поскольку вы выбираете только те столбцы, которые вам действительно нужны, и все это делается в одном запросе. .