在无类型实体上应用查询选项

本文关键字:应用 查询 选项 实体 类型 | 更新日期: 2023-09-27 18:05:15

如何将查询选项应用于非clr类型。当我使用。applyto方法时抛出了一个错误。

错误:

"查询选项没有绑定到任何CLR类型。"ApplyTo"只是由绑定到CLR类型的查询选项支持。"

var x = (EdmCollectionType)Request.GetODataPath().EdmType;
ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), x.ElementType.Definition);
ODataQueryOptions queryOptions = new ODataQueryOptions(queryContext, Request);
//codes.....
queryOptions.ApplyTo(Products);

在无类型实体上应用查询选项

正如错误提示所说,查询选项现在不能应用于非clr类型。

这是因为现在webapi需要clr类型来为查询选项生成linq表达式。

但是,您可以使用查询选项中的原始值自己在非clr类型上实现ApplyTo函数:

queryOptions.Filter.RawValue
queryOptions.OrderBy.RawValue
...
ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), x.ElementType.Definition);

在上面的行中,我们需要显式地将类类型obj传递给ODataQueryContext。让我们假设在运行时创建了一个名为 a 的类型。

Type a = //Get the type at runtime ;
ODataQueryContext queryContext = new ODataQueryContext(Request.GetEdmModel(), a);

这将解决异常。

现在,来ApplyTo(),我们可以传递一个A类型的实例给它。

object instance = Activator.CreateInstance(a);
odataQuerySetting.ApplyTo(instance,, new ODataQuerySettings() { });

但是,我们希望对对象列表和一个实例运行ApplyTo()。数组类可以帮助我们实现这一点。假设需要创建10个实例:

Array values = Array.CreateInstance(a, 10);
for (int i = 0; i < 10; i++)
        {
            values.SetValue(Activator.CreateInstance(t), i);
        }

不用说,我们可以添加属性到我们的实例,我们想,然后传递给SetValue()。最后,可以对列表执行ApplyTo(),如下所示:

  queryOptions.ApplyTo(values.AsQueryable());

注意:如果你得到状态:406,那么一个可能的原因可能是JsonFormat。使用自定义MediaTypeFormatter来解决这个问题。

我希望这能帮助到一些人。