Entity Framework - Включить в подзапрос? - PullRequest
3 голосов
/ 02 ноября 2009

Я не уверен, что на этот вопрос уже ответили, я посмотрел пару вопросов, но я не думаю, что они были совсем такими, как я.

Допустим, у меня есть 3 таблицы:

Restaurant 1.....M MenuCategory 1.....M MenuItem

У меня есть запрос L2E, который выглядит примерно так:

Restaurant = context.Restaurant
   .Include(r => r.MenuCategory)
   .FirstOrDefault(r => r.RestaurantId == resaurantId);

Что работает до некоторой степени, но только предварительно загружает категории меню.

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

То, что я действительно хочу сделать, это что-то вроде:

Restaurant = context.Restaurant
   .Include(r => r.MenuCategory)
   .Include(r => r.MenuCategory.MenuItems)
   .FirstOrDefault(r => r.RestaurantId == resaurantId);

Но очевидно, что это недоступно, так как r.MenuCategory является перечисляемым

ОТВЕТ 1:

context.Restaurant.Include ( "MenuCategory.MenuItems");

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

Я перенес это на другой вопрос, так как чувствовал, что несправедливо отказываться от идеального ответа, который работает именно так, как и должен:

Entity Framework - Включить в подзапрос? - часть 2

Ответы [ 2 ]

7 голосов
/ 04 августа 2011

Вы все еще можете использовать строго типизированную версию, чтобы сделать это. Просто используйте:

    Restaurant = context.Restaurant
    .Include(r => r.MenuCategory.Select(m => m.MenuItems))
    .FirstOrDefault(r => r.RestaurantId == resaurantId);
2 голосов
/ 02 ноября 2009

Эта ссылка здесь , кажется, решает вашу проблему?

var result = context.Restaurant.Include("MenuCategory.MenuItems");
...