使用breeze执行选择并在同一查询中展开不受支持

Bro*_*ato 5 breeze durandal

我用Durandal/breeze开发了一个asp.net解决方案.

这是我的代码,以获取我的所有托运人:

var query = EntityQuery.from('Shippers')
               .select('id, name, street, city');

return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);
Run Code Online (Sandbox Code Playgroud)

这是相关的模型:

public class Shipper
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Street { get; set; }
    public string Number { get; set; }
    public City City { get; set; }
}

public class City
{
    public int Id { get; set; }        
    public string Name { get; set; }
    public string PostCode { get; set; }
    public Country Country { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我还需要包括国家

public class Country
{
    [Key]
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是根据实际查询,我没有得到它的国家.

我尝试:

var query = EntityQuery.from('Shippers')
               .select('id, name, street, city')
               .expand('City.Country');
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

use of both 'expand' and 'select' in the same query is not currently supported

我的问题:如何获得国家?


UPDATE

正如杰伊所说,我们可以这样做:

var query = EntityQuery.from('Shippers')
       .select('id, name, street, city, city.country')
Run Code Online (Sandbox Code Playgroud)

现在,我得到了一个city_Country对象:

在此输入图像描述

我不明白为什么我们得到这个,city_Country因为国家数据已经在city\country对象中可用:

在此输入图像描述

此外它给我带来了问题,因为我的下一个语句试图将我的dto映射到我的实体,并且我的实体中city_Country不存在该对象,并且在映射时发生错误.

下面我们看到我的实体对象并没有city_Country对象:

在此输入图像描述

我必须在我的映射上做一些特殊的事情以避免它吗?

下面是我的映射操作函数:

function mapToEntity(entity, dto) {
     // entity is an object with observables
     // dto is from json
     for (var prop in dto) {
          if (dto.hasOwnProperty(prop)) {
             entity[prop](dto[prop]);
          }
     }
     return entity;
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*and 8

我不确定使用投影"部分"填充实体是一种好习惯,这就像你正在做的那样.Breeze将自动映射它在结果集中找到的任何真实"实体".那么为什么不简单地使用

var query = EntityQuery.from('Shippers')
    .where(...)
    .expand('city.country');
Run Code Online (Sandbox Code Playgroud)

直接结果将是托运人的集合,但每个托运人都将其城市和嵌套国家/地区属性完全解析为实体.它们将通过返回托运人的导航提供,但如果您想直接查询它们,它们也将在entityManager缓存中可用.

第二个注释:Breeze'expand'语义与实体框架具有相同的限制.这意味着我们无法扩展投影的属性.

所以你可以跳过预测(如上所述)

var query = EntityQuery.from('Shippers')
   .where(...)
   .expand('city.country')
Run Code Online (Sandbox Code Playgroud)

并获得完整的"托运人"实体,其中包含城市中的"城市"和"国家"属性.或者您可以进行投影,在这种情况下,您自己执行扩展的等效项.即

在这种情况下,你会

var query = EntityQuery.from('Shippers')
  .select('id, name, street, city, city.country')
Run Code Online (Sandbox Code Playgroud)

在这种情况下,结果集中的每个项目将包含5个属性.请注意,在这种情况下,只有'city'和'city.country'属性将添加到entityManager的缓存中,因为这些是结果集中唯一的"真实"实体.即没有托运人

要明确的想法是查询的"结果"和查询的"副作用"是不同的.查询的顶级结果将与您期望的形状完全相同.查询的"副作用"是您执行的任何"展开"的结果.这些不会更改查询的形状,只是更改结果中任何嵌套的"实体"属性的分辨率.

希望这可以帮助.