使用 OData/BreezeJS 过滤 3 个深层实体

Filtering on 3 deep-level entity with OData/BreezeJS

我对 OData、EF 和 BreezeJS 概念还很陌生。我现在负责一个已经在 Entity Framework/BreezeJS/Angular 库的帮助下开发的项目。我需要改进它。

在 BreezeJS 生成的 OData 调用中,有些东西我真的不明白。

我想做的是 通过获取兴趣代码和法语标签列出链接到广告系列的所有兴趣 ('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';

是的,我知道查询可以更简单,我这样写的原因是,我放了几个 primary/foreign 键约束来帮助 Entity Framework 到 'discover'型号。

首先,这是我的问题涉及的数据模型部分:

这里的主要table是CAMPAIGN_INTEREST。其内容如下:

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

tableLK_CAMPAIGN_INTEREST_CODE包含:

CODE
01
02
03
04

tableLK_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 包含:

LANG
EN
FR

现在,我正在尝试通过直接发送 OData URL.

来调试我的 BreezeJS 查询

以下查询 returns 只有 "Office" 值,在 '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&

这 returns 我所有的语言,而不仅仅是 'FR' 一种。

当我尝试将上面 URL 中的 'any' 关键字更改为 'all' 时,returns 什么也没有。

我不明白的是,当我尝试过滤 VALUE 列(此处显示第一个 URL)时,它起作用了。如果我尝试在 CODE 列上进行过滤,它也会起作用。唯一不起作用的列是 LANG 列。

你可以在那个部分图上看到的是,LK_APP_LANGUAGE 被用在几个 LK_* table 中(这就是为什么我在这里放了另一个我没有使用的 LK)。事实上,在应用程序中,每个 LK_ 都被翻译了,这就是为什么我要在 LANG 列上进行过滤的原因。

如何使用 OData URL 过滤条件实现此目的?

我不会在这里放 C# 和 JS 代码,因为我不知道它现在是否相关。如果您需要,请发表评论,我会编辑 post.

非常感谢任何帮助!处理这个我失去了一天。非常感谢!

我完成了对上述查询创建 SQL 视图,然后在 EF 模型上引用它。然后,只需在该视图上调用 BreezeController。

这样OData查询就更简单了