Я совершенно новый с концепциями 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 «открыть» модель.
Первое, это часть модели данных заинтересованных по моей проблеме:
Основная таблица здесь является 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, потому что я не знаю, действительно ли это актуально. Если вам это нужно, просто поставьте комментарий, и я отредактирую сообщение.
Любая помощь будет очень признательна! Я потерял один день, разобравшись с этим. Большое спасибо!