5

WebAPIを使用して、RavenDbから基本的なSupplierオブジェクトのコレクションを返しています。

サプライヤークラスは次のとおりです。

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.Client2.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)
4

1 に答える 1

9

私はあなたの問題を再現することができ、何がうまくいかないかについての私の最初の推測をうまく検証することができました。[Queryable(EnableConstantParameterization = false)]プレーンの代わりに試してください[Queryable]。OData開発サイクルの後半で、LINQクエリのEF自動コンパイルを最適に利用するためにパフォーマンスを変更しました。安全な変更であるため、デフォルトで有効にしています。残念ながら、RavenDB LINQプロバイダーは、この最適化で生成されたLINQクエリを理解できないと思います。私が共有したコードはそれをオフにし、バニラLINQクエリを生成します。

于 2013-03-10T05:23:11.963 に答える