我正在尝试使用Breeze执行查询,该查询将返回已过滤的子实体选择。我有两个自定义dtos定义如下:
#region Dto Models
public class ProductDto {
public int ProductDtoId { get; set; }
public int ProductClassId { get; set; }
public ICollection<ProductRequiredInputDto> RequiredInputs { get; set; }
}
public class ProductRequiredInputDto
{
public int ProductRequiredInputDtoId { get; set; }
public string Product { get; set; }
public string Capacity { get; set; }
public string Electrical { get; set; }
//Navigation properties
public virtual ProductDto ProductDto { get; set; }
}
#endregion
我的第一个问题是简单地返回一个填充的ProductDto模型。
var query1a = this.entityQuery.from('ProductModel')
return this.entityManager.executeQuery(query1a) // returns a promise
.then(data => { this.product = data.results}
当我调用我的web api控制器时,一切都按预期工作,因为我收到一个填充了ProductRequiredInputDto模型集合的单一ProductDto模型。这是一个示例:
0:ProductDto__IPE_Data_DtoModels ProductClassId:1 ProductDtoId:1 RequiredInputs:数组[40] _backingStore:对象 ProductClassId:1 ProductDtoId:1 RequiredInputs:Array [40]
现在,我想要实现的是在ProductDto模型上执行第二个查询,该查询将从RequiredInputs属性返回ProductRequiredDto模型的过滤数组。我查看了Breeze示例和示例,但未能找到解决此特定问题的方法。
答案 0 :(得分:0)
简短回答:不,我不认为您可以从EntityQuery过滤ICollection导航属性。
更长的答案:您可以在使用.Include(&#34; RequiredInputs&#34;)的控制器上编写自定义方法,您可以使用LINQ在控制器上执行所需的过滤。
除此之外:我发现您在ProductRequiredInputDto对象上没有ProductDtoID属性这一点很奇怪。
答案 1 :(得分:0)
是否必须调用检索ProductDto的函数?因为它对我来说听起来不合逻辑。我会创建一个控制器功能:
[HttpGet]
public IQueryable<ProductRequiredInputDto> ProductRequiredInputDtos()
{
return _contextProvider.ProductRequiredInputDto;
}
并在以下行中使用客户端查询:
var idPredicate = breeze.Predicate.create('id', '==', yourSelectedProductDtoId);
var yourPredicate = breeze.Predicate.create('yourProductRequiredInputDtosProperty, 'yourOperator, 'yourValue');
var query = entityQuery.from('ProductRequiredInputDtos').where(idPredicate).and(yourPredicate);
Jonathan的方法也可行,但是你有一种专门的控制器功能用于一种类型的呼叫,并且那些很快就会堆积起来(除非你通过接收params使它们变得通用,但那是另一个故事)。这样,您可以从客户端对此模型进行任何查询,而不会使控制器混乱。