使用ODataQueryOptions过滤包含自定义类型的Linq

时间:2016-08-29 05:56:25

标签: c# linq asp.net-web-api odata unit-of-work

在MVC中实现执行服务器端操作的Kendo Grid时,我发现自己处于棘手的状态,即我必须使用linq过滤,排序,分页我的数据。我得到的所有信息都是ODataQueryOptions类型。

(不确定是否有必要提及,但为了完整起见,我们通过UnitOfWork模式执行查询操作)

因此执行查询的操作将复制到下面:

public static List<T> GetT(this IRepositoryAsync<T> repository, ODataQueryOptions<T> options)
    {
        var query = repository.Query().Tracking(false).Include(x => x.T2)
            .Select(s => new
            {
                P1 = s.P1,
                P2 = s.P2,
                P3 = s.T2.P1 + "," + s.T2.P2
            })
            .Select(s => new T1
            {
                P1 = s.P1,
                P2 = s.P2,
                P3 = s.P3
            });

        if (options.Skip != null)
            query = query.Skip(options.Skip.Value);
        if (options.Top != null)
            query = query.Take(options.Top.Value);

        return query.ToList();
    }

现在,我想知道是否有选项可以将剩余的oData选项应用于linq查询(如您所见,$ skip和$ top已经应用,我们如何应用OrderByQueryOption和FilterQueryOption)。

1 个答案:

答案 0 :(得分:0)

OrderByQueryOption中有一个属性OrderByNodes您可以使用它来构建您的查询,但在FilterQueryOption中,很难翻译FilterClause,您需要使用FilterBinder执行此操作你在5.9.1中没有公开,它在6.0.0中是公开的。