2013-03-10 67 views
5

我使用的WebAPI從RavenDb的WebAPI,ODATA和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) 
+0

你能分享堆棧跟蹤嗎? – 2013-03-10 04:53:48

+0

我已將堆棧跟蹤追加到問題 – valps 2013-03-10 05:01:05

回答

9

我能瑞普您的問題,是能夠成功地驗證我最初的猜測,有什麼可以去錯了。嘗試[Queryable(EnableConstantParameterization = false)]而不是簡單的[Queryable]。在OData開發週期的後期,我們進行了一次性更改,以便最佳使用EF automatic compilation of LINQ queries.默認情況下啓用它,因爲這是一個安全更改。不幸的是,我認爲RavenDB LINQ提供程序無法理解使用此優化生成的LINQ查詢。我共享的代碼將其關閉,並生成香草LINQ查詢。

+1

好。另外,你可能想把'HandleNullPropagation'設置爲false。請參閱[此主題](https://groups.google.com/d/msg/ravendb/o2kbCy57Yqs/rUAmxaILanMJ) – 2013-03-10 20:39:00