Wenn jemand mit dem Linq.Dynamic-Namespace sehr vertraut ist, könnte ich etwas Hilfe gebrauchen - ich konnte keine ausführlichen Ressourcen im Internet finden.
Im Grunde verwende ich DynamicExpression.ParseLambda, um einen Ausdruck zu erstellen, bei dem der Typ zur Kompilierungszeit nicht 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;
}
Das ist eine einfache Binärfunktion wie "Alter > 15" oder so.
So funktioniert die Funktion "GetExpression": Sie nimmt 2 Typen an - einen Eingabetyp und einen Ausgabetyp - und erzeugt schließlich das, was normalerweise mit einem Func-Delegaten erstellt würde. Außerdem nimmt sie eine Zeichenkette, die die Abfrage darstellt, und ein params-Objekt[] mit Werten entgegen, die oben als "expressionString" bzw. "values" bezeichnet sind.
Allerdings habe ich Probleme bei der Ausführung des dynamischen Ausdrucks in LINQ-to-SQL, mit einem DataContext aus SqlMetal generiert (.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>
enthält keine Definition für "Where" und die beste Erweiterungsmethode ist die Überladung
System.Linq.Dynamic.DynamicQueryable.Where<T>(System.Linq.IQueryable<T>, string, params object[])
hat einige ungültige Argumente.
Ich weiß, dass meine DataContext-Instanz tatsächlich die Sql-Tabellen als Eigenschaften behandelt... muss ich mit GetProperty() irgendwie reflektieren, damit dies funktioniert? Oder vielleicht muss ich eine andere .Where-Erweiterung erstellen?