我使用Durandal / breeze开发了一个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
我的问题:如何获得国家/地区?
更新
正如杰伊所说,我们可以这样做:
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;
}
答案 0 :(得分:8)
我不确定使用投影来“部分”填充实体是一种好习惯,这就像你正在做的那样。 Breeze将自动映射它在结果集中找到的任何真实“实体”。那么为什么不简单地使用
var query = EntityQuery.from('Shippers')
.where(...)
.expand('city.country');
直接结果将是托运人的集合,但每个托运人也将其城市和嵌套国家/地区属性完全解析为实体。它们将通过返回的托运人导航提供,但如果您想直接查询它们,它们也可以在entityManager缓存中使用。
第二个注释:Breeze'expansion'语义与实体框架具有相同的限制。这意味着我们无法扩展投影的属性。
所以你可以跳过预测(如上所述)
var query = EntityQuery.from('Shippers')
.where(...)
.expand('city.country')
并获得完整的“托运人”实体,其中包含城市中的“城市”和“国家/地区”属性。或者您可以进行投影,在这种情况下,您自己执行扩展的等效项。即
在这种情况下,你将
var query = EntityQuery.from('Shippers')
.select('id, name, street, city, city.country')
在这种情况下,结果集中的每个项目将包含5个属性。请注意,在这种情况下,只有'city'和'city.country'属性将添加到entityManager的缓存中,因为这些是结果集中唯一的“真实”实体。即没有托运人的
要明确的想法是查询的“结果”和查询的“副作用”是不同的。查询的顶级结果将与您期望的形状完全相同。查询的“副作用”是您执行的任何“展开”的结果。这些不会更改查询的形状,只是更改结果中任何嵌套的“实体”属性的分辨率。
希望这有帮助。
答案 1 :(得分:1)
我们允许这样做:
var query = EntityQuery.from('Shippers')
.select('id, name, street, city, city.country')