【发布时间】:2014-01-19 01:59:22
【问题描述】:
我刚刚开始使用 Breeze(使用 Angular)并设法从我的 Odata 服务中获取一些数据并将其显示在页面上。但是,我现在需要通过外键获取相关字段(我需要获取与 Team 对象相关的 Group)并且我遇到了一些困难。在 1.0.3 版之后使用 datajs 会导致问题,所以我使用的是 1.0.3 版,但是这个版本不允许使用“扩展”。因此,我在模型中禁用了延迟加载,并在进入控制器时使用了 Include:
public partial class Team
{
public int TeamId { get; set; }
public string TeamName { get; set; }
public string FlagSmall { get; set; }
public string FlagLarge { get; set; }
public string BadgeSmall { get; set; }
public string BadgeLarge { get; set; }
public string TeamImage { get; set; }
//foreign key
public int GroupId { get; set; }
//navigation properties
public Group Group { get; set; } //virtual removed to disable lazy loading
}
// GET odata/Teams
[Queryable]
public IQueryable<Team> GetTeams()
{
return db.Teams.Include("Groups"); //get navigation property
}
// GET odata/Teams(5)
[Queryable]
public SingleResult<Team> GetTeam([FromODataUri] int key)
{
return SingleResult.Create(db.Teams.Include("Groups").Where(team => team.TeamId == key));
}
但是,这也不起作用,它给出了与> datajs 1.0.3 引起的错误类似的错误:
[Q] Unhandled rejection reasons (should be empty): ["createError@http://bras...s/datajs-1.0.3.js:1055\n"]
有没有人解决这个问题并设法通过外键获取相关字段?
编辑:
这是我的 Angular 代码,我尝试引用 team.Group.GroupName、team.GroupName 和 group.GroupName,但这些都不起作用:
<tbody>
<tr ng-repeat="team in teams | filter:search:TeamName | orderBy:'TeamId'" id="team_{{team.id}}">
<td>{{team.TeamId}}</td>
<td>{{team.TeamName}}</td>
<td><img src={{team.FlagSmall}}></img></td>
<td><img style="width:40px;height:40px" src={{team.FlagLarge}}></img></td>
<td><img style="width:40px;height:40px" src={{team.BadgeSmall}}></img></td>
<td><img style="width:40px;height:40px" src={{team.BadgeLarge}}></img></td>
<td><img style="width:80px;height:40px" src={{team.TeamImage}}></img></td>
<td>{{team.Group.GroupName}}</td>
</tr>
</tbody>
编辑 2:
这是我的微风查询:
this.basicTeamQuery = function () {
return manager.executeQuery(entityQuery.from("Teams")).to$q();
};
编辑 3:
经过一些试验后,我设法使用以下 Breeze 查询来解决这个问题:
this.basicTeamQuery = function () {
return manager.executeQuery(entityQuery.from("Teams").
select("TeamId, TeamName, FlagSmall, FlagLarge, BadgeSmall, BadgeLarge, TeamImage, " +
"Group.GroupName").expand("Group")).to$q();
};
不确定这是否是执行此操作的正确方法,或者即使它应该工作...不是扩展不应该与 Angular 一起工作吗?
编辑 4:
这是最终的工作查询,不需要上面的选择:
this.basicTeamQuery = function () {
return manager.executeQuery(entityQuery.from("Teams").
expand("Group")).to$q();
};
【问题讨论】:
-
你确定这个错误只会在你出现时才出现。包括导航属性?听起来我的承诺没有兑现……
-
在我添加上述更改之前(模型的Group字段中包含和删除虚拟关键字),它成功返回了数据
-
请复制您用来获取数据的微风查询
-
请参阅上面的编辑 2。我是否需要在查询中向 Groups 表添加连接才能访问相关的 Group 信息?是否有可能在 Breeze 中做到这一点,因为我猜 Breeze 使用 expand 来达到这个目的?
-
没有选择就无法展开工作?
标签: javascript angularjs asp.net-web-api odata breeze