Asp.net web api WebAPI、oData和RavenDb-为$top和$skip抛出错误

Asp.net web api WebAPI、oData和RavenDb-为$top和$skip抛出错误,asp.net-web-api,ravendb,odata,Asp.net Web Api,Ravendb,Odata,我正在使用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()

我正在使用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>();
    }
}

我能够重新编写您的问题,并成功地验证了我对可能出现错误的初步猜测。尝试
[Queryable(EnableConstantParameterization=false)]
而不是普通的
[Queryable]
。在OData开发周期的后期,我们做了一个perf更改,以最佳利用我们默认启用它,因为这是一个安全的更改。不幸的是,我认为RavenDB LINQ提供者无法理解使用此优化生成的LINQ查询。我共享的代码将其关闭并生成普通的LINQ查询。

您可以共享堆栈跟踪吗?我已将堆栈跟踪附加到问题good catch。此外,您可能需要设置
HandleNullPropagation
false。看见
   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)