Entity Framework Как запросить данные в таблице свойств навигации - PullRequest
1 голос
/ 19 октября 2010

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

m_handsets = From p In RL.App.TComEntities.tblTelephoneNumbers _
                                               Where p.companyId = m_CompanyID _
                                               Select p

m_handsets = DirectCast(m_handsets, ObjectQuery(Of RL.TelephoneNumbers)).Include("tblCalls")

, где m_handsets определяется как

Private m_handsets As IQueryable(Of RL.tblTelephoneNumbers)

, которая работает, как и ожидалось, однако я хочу знать, что запросить свойство Navigation (tblCalls) поэтому я могу сделать что-то вроде следующего

From p In m_handsets.tblCalls 
Where m_handsets.tblCalls.price > 100

, но я не имею представления о правильном синтаксисе, кто-нибудь может помочь?

РЕДАКТИРОВАТЬ:

Я думаю, что здесь возникает сложность, потому что в этом случае у меня может быть 5 номеров tblTelephoneN в m_handsets и затем x количество вызовов для этого конкретного телефонного номера.Я заинтересован в tblCalls для каждого, но я хотел бы отфильтровать их все для каждого tblTelehoneNumber.

Диаграмма сущностей, которая (надеюсь) должна проиллюстрировать далее diagram

Так что в настоящее время я знаю всетрубки, которые связаны с интересующей меня компанией. Я также могу видеть вызовы, загруженные как свойство навигации в режиме отладки, но я хочу сказать, это взять этот фильтр (в этом примере цена> 100 и применить его ко всем трубкам-> звонки

1 Ответ

1 голос
/ 19 октября 2010

Если вы правильно поняли ваш вопрос, то у вас есть 2 решения для этого: В обоих решениях вы увидите, что я удаляю метод Включить , поскольку Включить НЕ позволяет фильтровать связанные данные.

1. Отфильтрованная проекция (возвращает анонимный тип) :

<code>Dim results = From p In RL.App.TComEntities.tblTelephoneNumbers _
              Where p.companyId = m_CompanyID _
              Select New With {.Handsets = p, _
                               .tblCalls = p.tblCalls.Where(Function(t) t.price > 100)} </p>

<p>
Однако это может быть нежелательно во всех ситуациях, поскольку дает коллекцию объектов анонимного типа.


2. Два отслеживаемых запроса (возвращает объекты EntityObjects):
Это дает вам коллекцию ваших сущностейобъектов tblTelephoneNumbers:

Dim m_handsets = (From p In RL.App.TComEntities.tblTelephoneNumbers _
                  Where p.companyId = m_CompanyID Select p).ToList()

Dim m_tblCalls = (From t In RL.App.TComEntities.tblCalls _
                  Where t.price > 100 Select t).ToList();

ForEach(Dim t In m_tblCalls) 
    m_handsets.Single(Function(h) h.ID = t.tblTelephoneNumberID).tblCalls.Add(t)
End ForEach


3. Использование метода Attach (возвращает EntityObjects) :
Последнее и, вероятно, самое лучшее и элегантное решение - использовать метод EntityCollection.Attach вместе с EntityCollection.CreateSourceQuery :

foreach (var tel in m_handsets) {

    IQueryable<tblCalls> sourceQuery = tel.tblCalls.CreateSourceQuery()
                                                   .Where(c => c.price > 100);
    tel.tblCalls.Attach(sourceQuery);
}


Извините за любую синтаксическую ошибку VB, я написал их все с ног на голову.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...