2015-09-14 5 views
0

Я совершенно новый с концепциями OData, EF и BreezeJS. Теперь я отвечаю за проект, который уже был разработан с помощью Entity Framework/BreezeJS/Angular библиотек. Мне нужно его улучшить.Фильтрация на 3 элементах с глубоким уровнем с OData/BreezeJS

В вызовах OData, порожденных BreezeJS, я действительно не понимаю.

То, что я пытаюсь сделать, это перечислить все интересы, связанные с Кампанией, получив код и ярлыки интересов на французском языке ('FR'). В основном это означает, что сочинительство этот запрос в нестандартном SQL:

select 
    CAMPAIGN_INTEREST.CODE, 
    LK_CAMPAIGN_INTEREST.VALUE 
from CAMPAIGN_INTEREST 
inner join LK_CAMPAIGN_INTEREST_CODE on CAMPAIGN_INTEREST.CODE = LK_CAMPAIGN_INTEREST_CODE.CODE 
inner join LK_CAMPAIGN_INTEREST on LK_CAMPAIGN_INTEREST_CODE.CODE = LK_CAMPAIGN_INTEREST.CODE 
inner join LK_APP_LANGUAGE on LK_CAMPAIGN_INTEREST.LANG = LK_APP_LANGUAGE.LANG 
where LK_APP_LANGUAGE.LANG = 'FR'; 

Да, я знаю, что запрос может быть более простым, поэтому я написал это таким образом, я положил несколько первичных/внешних ключей, ограничения, чтобы помочь Entity Framework «открыть» модель.

Первое, это часть модели данных заинтересованных по моей проблеме: Part of the Data Model concerned by the problem

Основная таблица здесь является CAMPAIGN_INTEREST один. Его содержание заключается в следующем:

FK_CAMPAIGN   POSITION CODE 
CAMP01    01   01 
CAMP01    02   04 
CAMP01    05   03 
CAMP02    01   04 
CAMP02    02   02 

В таблице LK_CAMPAIGN_INTEREST_CODE содержит:

CODE 
01 
02 
03 
04 

В таблице LK_CAMPAIGN_INTEREST содержит следующее:

CODE LANG VALUE 
01  EN  "Office" 
01  FR  "Office" 
02  EN  "Industry" 
02  FR  "Industrie" 
03  EN  "Innenraumleuchten" 
03  FR  "Interior Lighting" 
04  EN  "Special Lights" 
04  FR  "Feux spéciaux" 

И последняя из них, LK_APP_LANGUAGE, contai ns:

LANG 
EN 
FR 

Теперь, я пытаюсь отладить мой запрос BreezeJS, напрямую отправив URL-адрес OData.

Следующий запрос возвращает только значение «Офис», в обоих «EN» и язык «FR», для «CAMP01» кампании (примечание: этот URL был сгенерирован библиотекой BreezeJS):

http://localhost:50487/breeze/Breeze/CAMPAIGN_INTEREST?$filter=(FK_CAMPAIGN eq 'CAMP01') and (LK_CAMPAIGN_INTEREST_CODE/LK_CAMPAIGN_INTEREST/any(x2: x2/VALUE eq 'Office'))&$expand=LK_CAMPAIGN_INTEREST_CODE/LK_CAMPAIGN_INTEREST& 

Теперь я хочу, чтобы фильтровать на языке приложения, так что я написал следующее:

http://localhost:50487/breeze/Breeze/CAMPAIGN_INTEREST?$filter=(FK_CAMPAIGN eq 'CAMP02') and (LK_CAMPAIGN_INTEREST_CODE/LK_CAMPAIGN_INTEREST/any(x2: x2/LANG eq 'FR'))&$expand=LK_CAMPAIGN_INTEREST_CODE/LK_CAMPAIGN_INTEREST& 

Это возвращает меня все языки, а не только «FR» один.

Когда я пытаюсь изменить ключевое слово «любое» на «все» в указанном выше URL-адресе, он ничего не возвращает.

Что я не понимаю, когда я пытаюсь отфильтровать столбец VALUE (первый URL-адрес, показанный здесь), он работает. Если я попытаюсь фильтровать столбец CODE, он тоже работает. Единственные столбцы, которые не работают, - это LANG.

Вещь, которую вы можете видеть на этой частичной диаграмме, LK_APP_LANGUAGE используется в нескольких таблицах LK_ * (вот почему я поставил другую LK, которую я здесь не использую). Фактически, в приложении все LK_ были переведены, поэтому я пытаюсь фильтровать в столбце LANG.

Как достичь этого, используя условия фильтра URL-адресов OData?

Я не помещаю здесь код C# и JS, потому что я не знаю, действительно ли это актуально. Если вам это нужно, просто поставьте комментарий, и я отредактирую сообщение.

Любая помощь будет очень признательна! Я потерял один день, разобравшись с этим. Большое спасибо!

ответ

0

Я закончил создание представления SQL по запросу выше, а затем ссылку на него на EF-модели. Затем после этого просто позвоните в BreezeController в этом представлении.

Таким образом, запрос OData проще.