2016-06-22 2 views
1

次のコードが実行中に例外をスローする理由を理解できますか?基礎となるQueryProviderに対してIQueryable式を実行する

IQueryable<TestDto> data = Enumerable.Range(1, 10000).Select(i => new TestDto() 
{ 
     Id = i, 
     Name = (i%1000).ToString() 
}).AsQueryable(); 
var test = data.Provider.Execute<TestDto>(data.Expression); 

それは私にとって非常に奇妙であるQueryProviderと発現の両方が同じのIQueryableインスタンスから取得されたときに、そのクエリプロバイダは、式を実行することができません!

編集: Throw例外は、メソッドExecuteのパラメータ 'expression'を考慮したArgumentExceptionです。

+0

あなたはdata.Expression'は、あなたのケースであることを '何を期待していますか?あなたは何を得ているのですか? – user3185569

+2

あなたの場合、 'data.Expression'は複数の' TestDto'オブジェクトを返すことが期待されますが、 'TestDto'を' TResult'(単一項目)として渡しています。単一の 'TestDto'(戻り値の型は' TestDto')を返す式を渡してみてください。 –

+0

@ YacoubMassadありがとうございました。それはまさにその場合です:) –

答えて

0

Execute:基になるデータソースで指定された式を実行します。 data.ExpressionConstantExpression(値を保持)です。

Executeに有効な表現ツリーを渡す必要があります。プロバイダによってさらに解釈されることができる述語、またはProjectionである。以下は

は有効な使用です:

IQueryable<Item> data = Enumerable.Range(1, 10000).Select(i => new Item() 
{ 
     SomeProperty = i 
}).AsQueryable(); 

Expression<Func<Item, bool>> expression = x => x.SomeProperty > 50; 

var obj = data.Provider.Execute(expression); 
関連する問題