2010-12-31 10 views
6

Jeśli ktokolwiek jest bardzo znany z obszaru nazw Linq.Dynamic, mógłbym skorzystać z pomocy - nie mogłem znaleźć żadnych zasobów w Internecie.Wykonywanie DynamicExpression z nieznanymi typami

Zasadniczo używam DynamicExpression.ParseLambda stworzyć wyrażenie których typ nie jest znany w czasie kompilacji,

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

Jeżeli QueryFilter jest:

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

która reprezentuje prosty binarny działa jak "Wiek> 15" lub coś podobnego.

W ten sposób działa funkcja "GetExpression", pobiera ona dwa typy - jeden, który jest typem wejściowym i taki, który jest typem wyjściowym, i ostatecznie generuje to, co normalnie zostałoby utworzone przez delegata Func. Przyjmuje również ciąg, który reprezentuje zapytanie i obiekt params [] wartości, odpowiednio "expressionString" i "values" powyżej.

Mam jednak problem z wykonywaniem dynamicznego wyrażenia w LINQ-SQL, używając DataContext generowanego z SqlMetal (plik .dbmc).

DatabaseContext db = new DatabaseContext(connectionString); 

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

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

Wytwarza się następujący błąd,

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

nie zawiera definicji "Gdzie i najlepsze rozszerzenie metoda przeciążenie

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

ma pewne nieprawidłowe argumenty.

Wiem, że moja instancja DataContext faktycznie traktuje tabele sql jako właściwości ... czy muszę się zastanowić, jak GetProperty() w jakiś sposób działa? A może potrzebuję stworzyć kolejne rozszerzenie .Where?

Odpowiedz

2

Twoja funkcja GetExpression zwraca typ wyrażenia - metoda DynamicQueryable.Where, gdy jest używana jako metoda rozszerzenia, oczekuje, że łańcuch będzie pierwszym parametrem.

Trzeba wezwanie do Gdzie wyglądać następująco:

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

Ponadto, można spróbować następujących, po prostu być wyraźne:

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

pamiętać, że jeśli łatwiej można budować żądło zawierające pełny filtr i nie używać parametru obiektu [] w ogóle:

var query = db.SysEventLogT.AsQueryable().Where("Age > 15"); 
Powiązane problemy