如何在扩展实体的微风中使用Paging?

时间:2017-04-14 08:33:20

标签: entity-framework breeze paging expand

我正在服务器端使用EF并在客户端使用breeze编写Web应用程序。

我在EF中定义了以下类:

public class Product
{
   [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }
    [InverseProperty("Product")]
    public virtual ICollection<Property> Properties { get; set; }
}

public class Property
{
    [Key]
    public int Id { get; set; }
    public string Type { get; set; }
    public string Name { get; set; }
    public string DefaultValue { get; set; }
    [ForeignKey("Product")]
    public int ProductId { get; set; }
    public Product Product { get; set; }
}

public class PropValue
{
    [Key]
    [Column(Order = 0)]
    [InverseProperty("RecordId")]
    public int RecordId { get; set; }
    public Property Record { get; set; }
    [Key]
    [Column(Order = 1)]
    public int PropertyId { get; set; }
    public Property Property { get; set; }
    public string Value { get; set; }
}

这些类允许我在运行时创建各种'Products',每个'Products'具有任意数量的'Properties'(属性的名称在'Property'中,属性的值在'PropValue'中)。

在客户端,我需要检索产品 breeze作为项目列表,其中每个项目都包含“产品”表格中的“ID”和“名称”以及与该项目相关的属性,两者均来自“属性”表格(例如'名称'属性'以及'PropValue'表(特别是'Value'保存该属性的值)。我还需要按特定条件过滤的项目,例如只有'产品'的某些'Property'的'Value'大于0等。

这可以通过使用'expand'创建一个breeze查询来检索所有表中的数据来完成,例如:

var resultsQuery = new breeze.EntityQuery()
    .from("Records")
    .where(Predicate.and(andArray))
    .expand("propValues,product,product.properties")

其中'andArray'是一个微风Predicates数组,每个都定义为类似于:

Predicate.create("propValues", "any", Predicate.create("propertyId", "==", propID).and("value", ">", val)

并且始终在'andArray'中使用以下谓词来仅检索与产品相关的属性:

Predicate.create("productId", "==", productId)

使用这种方法,服务器端的代码是:

[HttpGet]
[AllowAnonymous]
[EnableBreezeQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IQueryable<Record> Records()
{
    return _contextProvider.Context.Records;
}

对我来说,使用breeze提供的caching机制非常重要,这样我才能从远程服务器检索一次数据。

上述方法存在的问题是我需要使用 paging:orderby,跳过。例如,我想要按某个属性的值排序的结果,除以每个有5个项目的页面,我只想要第2个页面。上面的breeze查询中没有分页,我看不到如何为这个查询添加分页。

有可能吗?我该怎么做?

是否可以在客户端创建微风查询来启用此功能?这是最好的,因为我可以通过breeze进行过滤(使用上面示例中显示的'Predicate')并依赖breeze来缓存数据。

或者我是否需要在服务器端创建一些代码,将上述3个表中的各个字段组合成一个项目列表,可能作为JSON对象,在服务器端而不是客户端进行过滤?并且该列表是否会被缓存?

如果可能的话,我将非常感谢服务器和客户端的简单示例代码。

谢谢!

0 个答案:

没有答案