的WebAPI,ODATA和RavenDb -
我使用的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%20desc
或http://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)
我能瑞普您的问题,是能够成功地验证我最初的猜测,有什么可以去错了。尝试[Queryable(EnableConstantParameterization = false)]
而不是简单的[Queryable]
。在OData开发周期的后期,我们进行了一次性更改,以便最佳使用EF automatic compilation of LINQ queries.默认情况下启用它,因为这是一个安全更改。不幸的是,我认为RavenDB LINQ提供程序无法理解使用此优化生成的LINQ查询。我共享的代码将其关闭,并生成香草LINQ查询。
好。另外,你可能想把'HandleNullPropagation'设置为false。请参阅[此主题](https://groups.google.com/d/msg/ravendb/o2kbCy57Yqs/rUAmxaILanMJ) – 2013-03-10 20:39:00
你能分享堆栈跟踪吗? – 2013-03-10 04:53:48
我已将堆栈跟踪追加到问题 – valps 2013-03-10 05:01:05