breezejs:查询继承实体的属性 让我们考虑下面的类: 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; } }

breezejs:查询继承实体的属性 让我们考虑下面的类: 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; } },breeze,Breeze,当我查询SourceMaterial实体时,将创建正确的资源实体(根据资源类型,创建PhysicalFile实体或Url实体) 但是,如果我这样做: var query = entityQuery.from('Requests') var predicate = new breeze.Predicate('sourceMaterials', 'any', new breeze.Predicate('resource.fileName', 'eq', '.doc')); (为清晰起见,代码被截断

当我查询
SourceMaterial
实体时,将创建正确的资源实体(根据资源类型,创建
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实体上,但这是否意味着我无法生成此类查询?

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));
}
否则,最接近的方法是通过限制“resourceType”属性(位于基类上)而不是“fileName”属性来完成至少部分过滤

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

我不太明白-您是说在资源中查找名为
fileName
的属性,但希望查询查找不同的实体类型?
var query = entityQuery.from('Requests')
var predicate = new breeze.Predicate('sourceMaterials', 'any', new breeze.Predicate('sourceMaterial.resourceType', 'eq', ???fileNameResourceType???));