0

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

是的,我知道查询可以更简单,我这样写的原因是,我放置了几个主键/外键约束来帮助实体框架“发现”模型。

首先,这是我的问题所涉及的数据模型的一部分: 问题关注的部分Data Model

这里的主表是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”活动的“Office”值,以“EN”和“FR”两种语言(注意:此 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 列上进行过滤的原因。

如何通过使用 OData URL 过滤条件来实现这一点?

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

任何帮助将不胜感激!处理这件事我失去了一天。非常感谢!

4

1 回答 1

0

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

这样,OData 查询就更简单了。

于 2015-09-16T09:14:03.750 回答