在无类型实体上应用查询选项
本文关键字:应用 查询 选项 实体 类型 | 更新日期: 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来解决这个问题。
我希望这能帮助到一些人。