我正在为单页面应用程序使用OData查询功能。我最近尝试根据用户权限在业务层添加一些过滤,这导致我的odata查询在某些情况下失败。
我的OData控制器引用业务层中的一个类,该类返回IQueryable。业务层引用实体框架数据库第一模型。
在我的业务层中,我有以下属性。
public IQueryable<Job> Jobs
{
get
{
IQueryable<Job> queryable = UnitOfWork.Jobs.AsExpandable();
var predicate = PredicateBuilder.False<Job>();
foreach (int clientID in userService.GetAllowedClientIds())
{
int temp = clientID;
predicate = predicate.Or(p => p.ClientId == temp);
}
return queryable.Where(predicate);
// I've tried returning this as .AsExpandable() again and as .AsQueryable() and neither change the result.
}
}
我的odata控制器是一个简单的传递给BL。
[Queryable(MaxExpansionDepth = 3)]
public IQueryable<Job> Get()
{
return jobService.Jobs;
}
现在,根据我在URL中传递的查询参数,我获取数据或"Cannot compare elements of type 'System.Collections.Generic.ICollection
1 [[AssociatedType]]'。只支持原始类型,枚举类型和实体类型。“`
例如,/Jobs?$expand=LatestJobAllocations/Gang
工作正常但/Jobs?$expand=JobLocationStructures
失败。区别在于LatestJobAllocations
是我添加到模型中的视图,而JobLocationStructures
是一个表格,Job
到LatestJobAllocations
也是1-0..1关系。
如果我向失败的请求添加分页奇迹般地起作用。 /Jobs?$expand=JobLocationStructures&$inlinecount=allpages&$top=25&$skip=0
这将是很好的,除了我不能使用分页来获取单个对象/Jobs(1234)?$expand=JobLocationStructures&$inlinecount=allpages&$top=25&$skip=0
失败,因为在单个实体端点上不允许分页。