Ограничение на Linq для субъектов включает - PullRequest
1 голос
/ 22 июня 2010

У меня есть таблица сообщений, которая самостоятельно присоединяется к себе, где Message.ID == Message.Parent.Итак, у меня есть 1 сообщение с несколькими сообщениями ChildMessages.Это хорошо настраивается с помощью свойства Navigation.

Код в настоящее время:

var message = from m in soe.Messages.Include("ChildMessages")
              where m.ID == id
              && m.IsActive
              select m;
return message.FirstOrDefault();

Что я действительно хочу, так это вернуть только 1 сообщение (равное определенному идентификатору и isActive) со всеми его активными дочерними сообщениями, и я хочу сделать это за один вызов базы данных.

Ответы [ 2 ]

1 голос
/ 22 июня 2010

У меня есть решение для 4.0 (я не уверен, что оно будет работать на 3.5, я не проверял).

Сначала установите свойство Lazy Loading Enabled вашей модели сущностей на false.Обратите внимание, что в результате вы потеряете ссылки при автоматической загрузке.

Далее попробуйте этот код:

var message = soe.Messages
    .Where(m => (m.ID == id || m.ParentId == id) && m.IsActive)
    .AsEnumerable()
    .FirstOrDefault(e => e.Id == id);

EF разрешит ссылки родитель-потомок и не будет загружать другиедочерние ссылки, если не будет сделан явный запрос (например, Include или Load).Обратите внимание, что вы должны перебрать результаты Where, используя AsEnumerable, иначе они не будут загружаться.

0 голосов
/ 05 января 2011

Я пришел к выводу, что в Entity Framework это невозможно.

Обходной путь - вернуть анонимный тип, который удовлетворяет ограничению. Э.Г.

var message = from m in soe.Messages
              where m.ID == id
              && m.IsActive
              select
                  new
                  {
                      Message = m,
                      ChildMessages = m.ChildMessages.Where(c => c.IsActive)
                  };
return message.FirstOrDefault()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...