breezejs:查询继承实体的属性

时间:2014-04-10 09:18:57

标签: breeze

让我们考虑以下几个类:

 public abstract class BaseEntity 
 {
    public virtual Guid Id { get; set; }
 }

 public abstract class Resource : BaseEntity
 {
    public virtual EResourceType ResourceType { get; set; }
 }

 public class PhysicalFile : Resource
 {      
    public virtual string FileName { get; set; }
 }

 public  class Url : Resource
 { 
 }

 public class SourceMaterial : BaseEntity
 {     
    public virtual Guid? ResourceId { get; set; }
    public virtual Resource Resource { get; set; }
 }

当我查询SourceMaterial实体时,根据ResourceType创建了正确的资源实体(PhysicalFile实体或Url实体。

但是,如果我这样做:

var query = entityQuery.from('Requests')
var predicate = new breeze.Predicate('sourceMaterials', 'any', new breeze.Predicate('resource.fileName', 'eq', '.doc'));

(为清晰起见,代码被截断)

然后当我执行查询时出现错误:

Error: unable to locate property: fileName on entityType: Resource:#CdT.EAI.Business.Entities undefined 

这是有道理的,因为fileName属性仅存在于PhysicalFile实体上,但这是否意味着我无法构建此类查询?

1 个答案:

答案 0 :(得分:3)

Breeze不支持此语法,即基于子类标准限制基类。 (不知道如何在没有其他信息的情况下将其转换为服务器查询)。

如果我能正确理解您的架构,我认为您最好的方法是使用Breeze' withParameters'与您处理子类型操作的另一个服务端点组合的方法。即

之类的东西
[HttpGet]
public IQueryable<Request> RequestsForFilesEndingWith(string fileExtn) {
  var requests = ContextProvider.Context.Requests
      .Where(r => r.SourceMaterials.OfType<PhysicalFile>
         .Any( pf => pf.FileName.EndsWith(fileExtn));
}

您的客户端查询变为:

 var query = entityQuery.from('RequestsForFilesEndingWith')
   .withParameters({ fileExtn: ".doc" });

否则,您能够获得的最接近的是通过限制“资源类型”来实现至少部分过滤。 property(在基类上)而不是&#39; fileName&#39;财产

var query = entityQuery.from('Requests')
var predicate = new breeze.Predicate('sourceMaterials', 'any', new breeze.Predicate('sourceMaterial.resourceType', 'eq', ???fileNameResourceType???));