2013-03-10 18 views
5

Używam WebAPI wrócić zbiór podstawowych obiektów dostawcy z RavenDb

Klasa Dostawca jest:

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

WebAPI metoda jest:

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

Kiedy zadzwonić http://localhost:8083/api/suppliers?$orderby=Id%20desc lub http://localhost:8083/api/suppliers?$filter=Title%20eq%20'Test' wszystko działa poprawnie. Jednak za każdym razem, gdy używam $ top lub $ skip, otrzymuję wyjątek:

Nie można rzucić obiektu typu "System.Linq.Expressions.PropertyExpression", aby wpisać "System.Linq.Expressions.ConstantExpression".

Jeśli zwrócę całą kolekcję do pamięci przy pomocy ToList(), to działa dobrze, więc wygląda na to problem z odroczonym wykonywaniem zapytania z RavenDb.

Używam najnowszej stabilnej wersji RavenDb.Client 2.0.2.2261.

Czy ktoś jeszcze miał ten problem lub miał na to rozwiązanie?

Ślad stosu jest:

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

Czy możesz udostępnić ślad stosu? –

+0

Dołączyłem ślad stosu do pytania – valps

Odpowiedz

9

udało mi się powtórzenia błędu swój problem i był skutecznie w stanie zweryfikować pierwsze przybliżenie, co może być nie tak. Wypróbuj [Queryable(EnableConstantParameterization = false)] zamiast zwykłego [Queryable]. Pod koniec cyklu rozwoju OData dokonaliśmy perfekcyjnej zmiany, aby optymalnie korzystać z EF automatic compilation of LINQ queries. Włączamy ją domyślnie, ponieważ jest to bezpieczna zmiana. Niestety, myślę, że dostawca RavenDB LINQ nie jest w stanie zrozumieć kwerend LINQ wygenerowanych przy tej optymalizacji. Kod, który udostępniłem, wyłącza go i generuje waniliowe zapytania LINQ.

+1

Dobry połów. Możesz również ustawić wartość "HandleNullPropagation" false. Zobacz [ten wątek] (https://groups.google.com/d/msg/ravendb/o2kbCy57Yqs/rUAmxaILanMJ) –

Powiązane problemy