2010-12-31 7 views
6

Wenn jemand mit dem Linq.Dynamic-Namespace sehr vertraut ist, könnte ich etwas Hilfe verwenden - konnte keine im Internet verfügbaren Ressourcen finden.Ausführen von DynamicExpression mit unbekannten Typen

Grundsätzlich ich DynamicExpression.ParseLambda bin mit einem Ausdruck zu schaffen, in dem der Typ nicht zum Zeitpunkt der Kompilierung bekannt ist,

public Expression GetExpression(Type t, List<QueryFilter> filters) 
{ 
    // pseudo code 
    // extracts a string representation of the query as 'expressionString' 

    return DynamicExpression.ParseLambda(t, typeof(Boolean), expressionString, values); 
} 

Wo ein Queryfilter ist:

public class QueryFilter 
{ 
    string propertyName; 
    ExpressionType operationType; 
    object value; 
} 

, die eine einfache binäre darstellt Funktioniert wie "Alter> 15" oder so.

So funktioniert die 'GetExpression'-Funktion, sie benötigt 2 Typen - einen Eingabe-Typ und einen Ausgabetyp und generiert schließlich, was normalerweise mit einem Func-Delegaten erstellt würde. Es nimmt auch eine Zeichenfolge, die die Abfrage darstellt, und ein params-Objekt [] von Werten, die 'expressionString' bzw. 'values' sind.

Ich habe jedoch Probleme beim Ausführen des dynamischen Ausdrucks in LINQ-to-SQL mit einem DataContext generiert aus SqlMetal (.dbmc-Datei).

DatabaseContext db = new DatabaseContext(connectionString); 

var filter = DynamicExpressionBuilder. 
     GetExpression(typeof(SysEventLogT), sysEventFilters) 

var query = db.SysEventLogT.Where(filter); 

erzeugt den folgenden Fehler,

System.Data.Linq.Table<DBReporting.Linq.Data.SysEventLogT> 

keine Definition für 'Wo' enthalten und die beste Erweiterung -Methodenüberladung

System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[]) 

einige ungültige Argumente hat.

Ich weiß, dass meine DataContext-Instanz tatsächlich die SQL-Tabellen als Eigenschaften behandelt ... muss ich irgendwie mit GetProperty() nachdenken, damit dies funktioniert? Oder vielleicht muss ich eine andere .Where Erweiterung erstellen?

Antwort

2

Ihre GetExpression gibt einen Ausdruckstyp zurück - die DynamicQueryable.Where-Methode erwartet als eine Erweiterungsmethode eine Zeichenfolge als ersten Parameter.

Sie müssen Ihren Anruf Wo wie folgt aussehen:

var query = db.SysEventLogT.Where("Age > @0", 15); 

Auch könnten Sie die folgende versuchen, nur explizit zu sein:

var query = db.SysEventLogT.AsQueryable().Where("Age > @0", 15); 

Beachten Sie, dass, wenn zu erleichtern, können Sie bauen ein Stich, der den vollen Filter enthält und den Parameter params object [] überhaupt nicht verwendet:

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 
Verwandte Themen