C# 将PredicateBuilder与WebAPI OData服务和EntityFramework一起使用

C# 将PredicateBuilder与WebAPI OData服务和EntityFramework一起使用,c#,entity-framework,asp.net-web-api,odata,predicatebuilder,C#,Entity Framework,Asp.net Web Api,Odata,Predicatebuilder,我正在为我的单页应用程序使用OData查询功能。我最近尝试在基于用户权限的业务层中添加一些过滤,这导致我的odata查询在某些情况下失败 我的OData控制器引用我的业务层中的一个类,该类返回一个IQueryable。业务层首先引用实体框架数据库模型 在我的业务层中,我有以下属性 public IQueryable<Job> Jobs { get { IQueryable<Job> queryable = UnitOfWork.Jobs.A

我正在为我的单页应用程序使用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.
    }
}
公共可查询作业
{
得到
{
IQueryable queryable=UnitOfWork.Jobs.AsExpandable();
var predicate=PredicateBuilder.False();
foreach(userService.getAllowedClientId()中的int-clientID)
{
int temp=clientID;
谓词=谓词或(p=>p.ClientId==temp);
}
返回queryable.Where(谓词);
//我已尝试将其作为.AsExpandable()和.AsQueryable()返回,但都没有更改结果。
}
}
我的odata控制器是到BL的简单传递

[Queryable(MaxExpansionDepth = 3)]
public IQueryable<Job> Get()
{
    return jobService.Jobs;
}
[可查询(MaxExpansionDepth=3)]
公共IQueryable Get()
{
返回jobService.Jobs;
}
现在,根据我在URL中传递的查询参数,我可以获取数据,也可以获取一个“
”无法比较“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
失败,因为在单个实体终结点上不允许分页。

显示
userService.GetAllowedClientId()
作业的代码。作业只是一个实体框架实体
getAllowedClient
返回
IEnumerable
,它只返回
new[]{1,2,3,4,5,6}目前,因为我还没有把它与任何更复杂的事情联系起来。一份工作是巨大的,它太大了,无法在一个如此复杂的问题中发表。不过它并没有什么特别之处,它只是映射到一个包含一些相关实体的表。什么是AssociatedType?谓词中的某些比较逻辑似乎不正确。看看这是否有帮助: