2010-11-04 5 views
1

У меня есть таблица AccountSecurity, которая является таблицей многих ко многим, которая связывает объекты Аккаунта и Ценные бумаги. Когда я пишу запрос ниже, он возвращает все Ценные бумаги, которые удовлетворяют условию where. Однако каждый экземпляр Security в списке больше не ссылается на учетную запись AccountSecurity. Поэтому, когда я перечисляю [0] .AccountSecurity, он пуст. Нужно ли включать эту информацию? Я знаю, что могу переписать запрос для возврата AccountSecurities и использовать .Include («Безопасность»), но мне интересно, можно ли это сделать другим путем.Entity Framework, как включить связанные объекты в этом примере

var list = (from acctSec in base.context.AccountSecurities 
      where acctSec.AccountId == accountId 
      select acctSec.Security).ToList(); 

UPDATE

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

var securities = (from acctSec in base.context.AccountSecurities 
      where acctSec.AccountId == accountId 
      select acctSec.Security).ToList(); 

//this query populates the AccountSecurities references within Security instances returned by query above 
var xref = (from acctSec in base.context.AccountSecurities 
      where acctSec.AccountId == accountId 
      select acctSec).ToList(); 

ответ

6
var list = (from sec in base.context.Securities 
            .Include("AccountSecurity") 
      where sec.AccountSecurities.Any(as => as.AccountId == accountId) 
      select sec).ToList(); 
+0

AccountSecurity - это таблица многих ко многим. Это означает, что существует только sec.AccountSecurities, потому что одна защита может принадлежать многим учетным записям. Я пробовал делать sec.AccountSecurities [0] .AccountId == accountId, но это вызывает исключение. – e36M3

+0

Переписал место для многих для многих. –

+0

спасибо! Я пропустил это, и единственная проблема, которую я вижу в этом, заключается в том, что в нее возвращаются ценные бумаги, которые будут иметь ссылку на все учетные записи, к которым они принадлежат, а не только тот, который указан в accountId. Другими словами, если у меня есть 5 ценных бумаг, но эти 5 ценных бумаг сопоставляются с 2000 учетными записями, то у меня есть 5x2000 строк. Я думаю, что может быть гораздо эффективнее сделать два запроса, чтобы сначала заполнить график ценными бумагами, а затем информацию acccountsecurity (many-to-many) позже. – e36M3

1

Попробуйте это:

var list = (from acctSec in base.context.AccountSecurities.Include("Security") 
      where acctSec.AccountId == accountId 
      select acctSec).ToList(); 

Тогда просто использовать свойство безопасности, как это необходимо, и так как он прочитал в то же время AccountSecurities есть (один SQL с присоединиться), это будет очень эффективный.

+0

это вернет список объектов AccountSecurity, а не объектов безопасности. Я знаю, что могу легко вытащить их через AccountSecurity.Security, но у меня есть еще одна проблема в игре здесь. Я фактически не перехожу в ToList() сразу, как я описал ранее. Я запускаю их с помощью метода, который я написал для динамического сортировки/отображения этих результатов. Короче говоря, мне нужны объекты верхнего уровня, которые возвращаются к типу Security. – e36M3

+0

Тогда, если вы одновременно не выберите исходный объект AccountSecurity, вы потеряете ссылку на него. например. ... выберите новый {Acct = acctSec, Sec = acctSec.Security} .... В качестве альтернативы, почему бы не использовать Linq для сортировки/подкачки для вас? например. Пропустить и принять методы? Таким образом, вы можете свободно выбирать все, что хотите, сортировать, делать пейджинг. Все в одной страшной (длинной) линейке доброты. – Will

+0

Я использую Linq для сортировки. Однако это «динамический» метод, который я написал, который принимает строку как выражение сортировки, которое представляет свойство объекта верхнего уровня, с помощью которого можно сортировать, направление сортировки и IQueriable. Этот метод не будет работать, если только элемент верхнего уровня (root) в этом IQueriable не соответствует выражению сортировки. Если бы я передал ему AccountSecurity в качестве корня и SecurityName в качестве выражения сортировки, он взорвется. Итак, вы видите, что я нахожусь в рассоле здесь :) Возможно, просто я должен сделать это в двух запросах, как я разместил в своем примечании UPDATE в главном посте. – e36M3

Смежные вопросы