执行SELECT和在同一查询扩大与清风不支持(Perform a select and expand

2019-08-19 07:34发布

我发展与迪朗达尔/微风一个asp.net的解决方案。

这里是我的代码,让我所有的货主:

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

return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

下面是相关的模型:

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; }
}

现在,我也需要包括国家

public class Country
{
    [Key]
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

但与实际的查询,我不得到它的国家。

我尝试:

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

但我得到的错误:

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')

现在,我得到了一个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;
}

Answer 1:

我不知道这是使用投影好的做法“部分地”补一个实体,它是什么样子,你正在做的。 微风将自动映射任何真正的“实体”发现你的结果集。 那么,为什么不直接使用

var query = EntityQuery.from('Shippers')
    .where(...)
    .expand('city.country');

直接结果将是托运人的集合,但每个托运人将有它的城市和嵌套国家性质完全解决的实体。 他们将可通过从返回货主导航但他们也将EntityManager的高速缓存内可用,如果你想直接查询他们。

第二个注意事项:微风“扩大”语义有实体框架做了同样的限制。 这意味着,我们不能扩大投影的性能。

所以,你可以跳过投影(如上)

var query = EntityQuery.from('Shippers')
   .where(...)
   .expand('city.country')

并获得完整的“托运人”实体与“城市”和“上城两个人口大国的财产。......或者,你可以做一个预测,在这种情况下执行扩张自己的equivalant。即

在这种情况下,你会

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

在这种情况下,在结果集中的每个项目将包括5个属性的。 注意,在这种情况下,只有“城市”和“city.country的属性将被添加到EntityManager的缓存becasue这些都是在结果集的唯一“真正”的实体。 即没有托运人

要明确的想法是,在查询和查询的“副作用”的“结果”是不同的。 查询的顶层结果正是你所期望的形状。 查询的“副作用”是任何“扩大”执行结果。 这些不更改查询的形状,他们只是改变结果内的任何嵌套的“实体”属性的分辨率。

希望这可以帮助。



Answer 2:

我们允许这样的:

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


文章来源: Perform a select and expand in the same query with breeze is not supported