Помогите с Linq to Entities простым подзапросом - PullRequest
1 голос
/ 21 января 2010

Я изучаю Entity Framework и пытаюсь заставить работать следующий сценарий.

У меня есть класс Person и класс Message. Класс сообщения имеет свойство From и свойство To, оба типа Person. Я хочу получить список сообщений, используя Linq to Entities. Мои таблицы БД - это Сообщение и Персона. В сообщении есть столбцы From и To типа int, указывающие на идентификатор PK таблицы Person.

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

var messages = from m in _entities.Message
                           select new BizObjects.Message
                           {
                               MessageId = m.MessageId,
                               From = new BizObjects.Person
                               {
                                   PersonId = m.From
                               },
                               To = new BizObjects.Person
                               {
                                   PersonId = m.To
                               },
                               Subject = m.Subject,
                               Content = m.Content,
                               Read = m.Read,
                               CreatedOn = m.CreatedOn,
                           };

Пожалуйста, дайте мне знать, если вам нужно больше кода или справочной информации. Заранее спасибо за помощь.

1 Ответ

1 голос
/ 21 января 2010

Вы должны иметь ассоциаций между 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.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...