【问题标题】:WebAPI, oData and RavenDb - throws an error for $top and $skipWebAPI、oData 和 RavenDb - 为 $top 和 $skip 引发错误
【发布时间】:2013-02-25 11:19:51
【问题描述】:

我正在使用 WebAPI 从 RavenDb 返回基本供应商对象的集合

供应商类是:

public class Supplier
{
    public string Id { get; set; }
    public string Title { get; set; }
}

WebAPI 方法是:

[Queryable]
public IQueryable<Supplier> Get()
{
    using (var session = _store.OpenSession())
    {
        return session.Query<Supplier>();
    }
}

当我打电话给http://localhost:8083/api/suppliers?$orderby=Id%20deschttp://localhost:8083/api/suppliers?$filter=Title%20eq%20'Test' 一切正常。但是,每当我使用 $top 或 $skip 时,都会出现异常:

无法将“System.Linq.Expressions.PropertyExpression”类型的对象转换为“System.Linq.Expressions.ConstantExpression”类型。

如果我使用 ToList() 将整个集合返回到内存中,它可以正常工作,因此它看起来像是使用 RavenDb 延迟执行查询的问题。

我正在使用 RavenDb.Client 2.0.2.2261 的最新稳定版本。

有其他人遇到过这个问题或有解决办法吗?

堆栈跟踪是:

   at Raven.Client.Linq.RavenQueryProviderProcessor`1.VisitQueryableMethodCall(MethodCallExpression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:line 994
   at Raven.Client.Linq.RavenQueryProviderProcessor`1.VisitMethodCall(MethodCallExpression expression, Boolean negated) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:line 693
   at Raven.Client.Linq.RavenQueryProviderProcessor`1.VisitExpression(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:line 140
   at Raven.Client.Linq.RavenQueryProviderProcessor`1.GetLuceneQueryFor(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:line 1318
   at Raven.Client.Linq.RavenQueryProviderProcessor`1.Execute(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProviderProcessor.cs:line 1352
   at Raven.Client.Linq.RavenQueryProvider`1.Execute(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProvider.cs:line 135
   at Raven.Client.Linq.RavenQueryProvider`1.System.Linq.IQueryProvider.Execute(Expression expression) in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryProvider.cs:line 190
   at Raven.Client.Linq.RavenQueryInspector`1.GetEnumerator() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Linq\RavenQueryInspector.cs:line 99
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Newtonsoft.Json.Serialization.JsonArrayContract.CreateWrapper(Object list)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value)
   at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value)
   at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
   at System.Net.Http.Formatting.JsonMediaTypeFormatter.<>c__DisplayClassd.<WriteToStreamAsync>b__c()
   at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)

【问题讨论】:

  • 你能分享一个堆栈跟踪吗?
  • 我已将堆栈跟踪附加到问题中

标签: asp.net-web-api ravendb odata


【解决方案1】:

我能够重现您的问题,并成功验证了我最初的猜测,即可能出了什么问题。尝试[Queryable(EnableConstantParameterization = false)] 而不是普通的[Queryable]。在 OData 开发周期的后期,我们进行了性能更改以充分利用 EF automatic compilation of LINQ queries. 我们默认启用它,因为它是安全的更改。不幸的是,我认为 RavenDB LINQ 提供程序无法理解使用此优化生成的 LINQ 查询。我分享的代码将其关闭并生成普通 LINQ 查询。

【讨论】:

  • 好收获。此外,您可能希望将HandleNullPropagation 设置为false。见this thread
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 2013-08-23
  • 2019-03-31
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2013-02-03
  • 2015-09-12
相关资源
最近更新 更多