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

时间:2015-09-14 17:43:41

标签: c# entity-framework odata breeze breeze-sharp

我对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';

是的,我知道查询可能更简单,我以这种方式编写的原因是,我提出了几个主要/外键约束来帮助实体框架“发现”模型。

首先,这是我的问题涉及的数据模型的一部分: 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 包含:

LANG
EN
FR

现在,我正在尝试通过直接发送OData URL来调试我的BreezeJS查询。

以下查询仅返回“CAMP01”广告系列中“EN”和“FR”语言的“Office”值(注意:此网址由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'。

当我尝试在上面的网址中将'any'关键字更改为'all'时,它不返回任何内容。

我不明白的是,当我尝试过滤VALUE列(此处显示的第一个URL)时,它可以正常工作。如果我尝试过滤CODE列,它也可以。唯一不起作用的列是LANG。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

通过这种方式,OData查询更加简单。