Не получают данные объекта Include - Entity Framework - PullRequest
0 голосов
/ 01 июля 2011

У меня проблема с " Включить " в Entity Framework. Предположим, у меня есть две таблицы с отношением внешнего ключа.

   var result = (from u in entity.Table1.Include("Table2")
          join o in entity.Table2 on u.Column1 equals o.Column1
          where u.Column2 == “abc” && u.Column3 == ‘xyz’ 
          && o.Column5 == organizationCode 
          select u).FirstOrDefault();

С помощью вышеупомянутого запроса он не возвращает данные объекта Table2 в результате, хотя у меня есть правильные данные в базе данных.

Проблема, которую я обнаружил с помощью вышеупомянутого запроса, заключается в том, что если в запросе есть «Включить», а также «Присоединиться», EF не рассматривает таблицы «Включить». Это мое предположение.

Потратив некоторое время, я получил данные, написав фиктивный запрос под ним. Пожалуйста, смотрите оба запроса ниже.

  var result = (from u in entity.Table1.Include("Table2")
          join o in entity.Table2 on u.Column1 equals o.Column1
          where u.Column2 == “abc” && u.Column3 == ‘xyz’ 
          && o.Column5 == organizationCode 
          select u).FirstOrDefault();


  var resultOrg = (from o in entity. Table2
                    where o.Column5 == organizationCode 
                    select o).FirstOrDefault();

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

1 Ответ

0 голосов
/ 01 июля 2011

Вы не можете использовать Include, если используете join.Теперь есть способ обойти это.Более того, то, что вы пытаетесь сделать, - это фильтрация включений, что также невозможно.

Вы можете сделать это:

var result = (from u in entity.Table1.Include("Table2")
              where u.Column2 == “abc” && u.Column3 == ‘xyz’ && 
                    u.Table2.Any(o => o.Column5 == organizationCode) 
              select u).FirstOrDefault();

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

Чтобы отфильтровать свойства навигации, вы должны использовать проекцию:

var result = (from u in entity.Table1
              where u.Column2 == “abc” && u.Column3 == ‘xyz’ && 
                    u.Table2.Any(o => o.Column5 == organizationCode) 
              select new 
                  {
                      Table1 = u
                      Table2 = u.Table2.Where(o => o.Column5 == organizationCode)            
                  }).FirstOrDefault(); 

Необходимо проецировать либо на анонимный тип, либо на пользовательский тип.

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

var result = (from u in entity.Table1
              where u.Column2 == “abc” && u.Column3 == ‘xyz’ && 
                    u.Table2.Any(o => o.Column5 == organizationCode) 
              select u).FirstOrDefault();


var resultOrg = (from o in entity. Table2
                 where o.Column5 == organizationCode 
                 select o).FirstOrDefault();
...