2015-03-17 3 views
1

У меня есть две таблицы с одной (Статьи) для многих (Подробнее) отношений. Подробности не могут содержать данные для конкретной статьи.Linq Foreign Key Select

Статьи: Id, Title, Numb (PK), Имя

детали: Удостоверение личности (ПК), Person, Numb (ФК), имя

В Entity Framework, есть соответствующие Свойства навигации и он показывает правильное одно: много отношений.

Что я хочу сделать, так это получить все статьи, соответствующие запросу конечного пользователя (по имени), а также все данные, если таковые имеются, из таблицы Details (Id, Person, Numb, Name).

Что я застрял прямо сейчас, я могу запросить статьи просто отлично (var article = db.Articles.Where(b => b.Name.Equals(name));), но в то время как результат включает HashSet для Details.Numb в каждой строке статей, данных в этом HashSet нет. В базе данных есть соответствующие соответствующие записи для статьи. Numb => Details.Numb.

ответ

0

Вы должны сказать EF, чтобы включить детали в наборе результатов после выполнения запроса (и соединение закрывается):

var article = db.Articles 
    .Include("Details") 
    .Where(b => b.Name.Equals(name)) 
    .FirstOrDefault(); 
+0

У меня есть аналогичная проблема с вопросом. Использование 'include()' не будет работать, поскольку внешний ключ был сгенерирован с помощью EF Code First. Если я включу внешний ключ в 'include', он ничего не найдет, потому что у моей модели нет столбца с именем' [имя столбца внешнего ключа] '. Вот мой оригинальный вопрос: 'https://social.msdn.microsoft.com/Forums/vstudio/en-US/d49772c9-c108-4418-b782-e231f60b6ffc/foreign-id-attribute-cannot-be-accessed-in- linq-query-for-an-a-a-class-that-has-a-list-of? forum = csharpgeneral' вы можете помочь? – naz786

0

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

1

На самом деле есть два способа достичь этого.

  1. Включить ленивые загрузки.
  2. Вызов Include метод, как говорят другие ответы.

Использование отложенной загрузки см msdn article более подробно.

db.ContextOptions.LazyLoadingEnabled = true; 

Использование Include методу

var article = db.db.Articles.Include("Details").Where(b => b.Name.Equals(name))).FirstOrDefault(); 
+0

Можно ли использовать Include без FirstOrDefault? Ожидается, что будут возвращены несколько записей. –

+0

Похоже, может быть что-то не так с отношениями (?). Когда я ломаю в отладчике и изучаю db.Articles results view, для получения результата, имеющего действительный FK в деталях, результатов нет. –

+0

Используя LINQPad, я смог успешно запросить (используя из статьи в статьях, где a.Name.Equals («значение») выбирают a) базу данных и результаты возврата. В этом случае он возвратил 3 результата из статей, а затем один из этих результатов имел EntitySet

с двумя результатами. В идеале я хотел бы, чтобы данные отображались. Используя тот же самый запрос в приложении веб-API, я все еще вижу Article.Detail.Count == 0 в том же самом результате, который возвращает EntitySet через LINQPad. –

0

Пример:

var allProducts = _db.Products.Include(d => d.Producer).ToList(); 

Всегда идти с Include вместо отложенной загрузки, если вы не уверены.

+0

Как я могу заставить Producer появиться в datagridview? dgv не смог прочитать его – Kokombads