2016-06-22 34 views
1

Könnten Sie mir helfen zu verstehen, warum der folgende Code während der Ausführung eine Ausnahme auslöst?IQueryable ausführen Ausdruck gegen zugrunde liegenden QueryProvider

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); 

Es mir sehr seltsam ist, ist, dass Abfrage-Provider nicht in der Lage Ausdruck auszuführen, wenn beide Queryprovider und Expression von derselben IQueryable Instanz getroffen werden!

Edit: Die ausgelöste Ausnahme ist ArgumentException unter Berücksichtigung des Parameters 'Ausdruck' der Methode Execute.

+0

Was erwarten Sie, 'data.Expression' in Ihrem Fall zu sein? Was ist der Fehler, den Sie bekommen? – user3185569

+2

In Ihrem Fall wird erwartet, dass 'data.Expression' mehrere' TestDto' Objekte zurückgibt, Sie aber 'TestDto' als' TResult' (einzelnes Objekt) übergeben. Versuchen Sie, einen Ausdruck zu übergeben, der ein einzelnes 'TestDto' zurückgibt (dessen Rückgabetyp' TestDto' ist). –

+0

@YacoubMassad Vielen Dank. Das ist genau der Fall :) –

Antwort

0

Execute: Führt den angegebenen Ausdruck für die zugrunde liegende Datenquelle aus. data.Expression ist ein ConstantExpression (Halten der Werte).

Sie müssen Execute einen gültigen Ausdrucksbaum übergeben, z. Ein filter Prädikat, oder ein Projection, das vom Anbieter weiter interpretiert werden kann.

Im Folgenden finden Sie eine gültige Nutzung:

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);