Entity Framework - загрузить данные из таблицы с таблицей 1: 1, используя один запрос? - PullRequest
1 голос
/ 08 июля 2010

У меня есть следующая команда:

var query = from x in context.FirstTable.Include("SecondTable")
where x.TestColumn == 5 &&
x.SecondTable.SecondTestColumn == 3
select x;

Теперь я также хочу загрузить записи из третьей таблицы с именем «ThirdTable». Но я могу ссылаться на него только через таблицу SecondTable. Существует внешний ключ от FirstTable до SecondTable и один от SecondTable до ThirdTable, но нет ни одного, от FirstTable до ThirdTable.

Использование следующего запроса было невозможно. Исключением было то, что он не может перейти от FirstTable к ThirdTable:

var query = from x in context.FirstTable.Include("SecondTable").Include("ThirdTable")
where x.TestColumn == 5 &&
x.SecondTable.SecondTestColumn == 3
select x;

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

Большое спасибо заранее!

Крейг Штунц:

У меня есть следующие внешние ключи: table1 <-> table2 <-> table3
скажем, таблицы следующие: заказы <-> клиенты <-> customer_preferences

Так что мне не нужно создавать внешний ключ от заказов до customer_preferences.
Это было бы ненужным большую часть времени. Как раз в этот раз я хочу сохранить некоторые дополнительные обходы базы данных.

Ответы [ 2 ]

2 голосов
/ 09 июля 2010

Вы можете сделать это через энергичную загрузку:

var query = from x in context.FirstTable.Include("SecondTable.ThirdTable") // remember, these are property names, not table names
            where x.TestColumn == 5 
                      && x.SecondTable.SecondTestColumn == 3
            select x;

Или (в основном это метод, который я использую):

var query = from x in context.FirstTable
            where x.TestColumn == 5 
                      && x.SecondTable.SecondTestColumn == 3
            select new PresentationModel
            {
                FirstTableColumn = x.Something,
                SecondTableColumn = x.SecondTable.SomethingElse,
                ThirdTableColumn = x.SecondTable.ThirdTable.StillMore
            };

Предполагается, что SecondTable: ThirdTable равен 1: 1 (вы не говорите). Если это 1: *, вы бы сделали что-то вроде:

var query = from x in context.FirstTable
            where x.TestColumn == 5 
                      && x.SecondTable.SecondTestColumn == 3
            select new PresentationModel
            {
                FirstTableColumn = x.Something,
                SecondTableColumn = x.SecondTable.SomethingElse,
                ThirdTableStuff = from y in x.SecondTable.ThirdTable
                                  select y.StillMore
            };
1 голос
/ 08 июля 2010

Если я правильно помню, «Включить» работает только для первой таблицы. Вместо этого вы можете сделать что-то вроде этого:

var query = from x in Invoices
   join p in Products 
   on x.Invoice_id equals p.Invoice_id
   join c in Customers 
   on x.Customer_id equals c.Customer_id
   where p.Customer_id == 123 
   && c.Description == "some description"
   select x;

Вы также можете попробовать что-то вроде этого

var query = from x in context.FirstTable.Include("SecondTable").Include("SecondTable.ThirdTable")
where x.TestColumn == 5 &&
x.SecondTable.SecondTestColumn == 3
select x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...