让我们考虑以下几个类:
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实体上,但这是否意味着我无法构建此类查询?
答案 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???));