Я работаю над транслятором LINQ to SQL. Он должен переводить запросы LINQ в SQL. Я сосредоточен на создании WHERE части запроса. Я просматриваю дерево выражений LINQ, а затем сталкиваюсь с проблемой, что не могу получить значение фактического параметра, переданного методу, содержащему вызов LINQ.
ПРИМЕЧАНИЕ. Я не использую ни LINQ to SQL, ни Entity Framework, ни NHibernate, потому что я просто не могу, поскольку в игре присутствует система VB6 Legacy.
Итак, чего я пытаюсь добиться, так это вызвать где-то на высоком уровне следующее:
int? parameterForCall = cmb.SelectedValue;
Затем у меня есть такой метод, и он находится в классе ExpenseDAL
, который вызывает BaseDAL<Expense>.GetAll(X)
:
public IList<Expense> GetAll(int? parameterForCall)
{
IList<Expense> expenses = BaseDAL<Expense>.GetAll(t => t.Fixed ==
parameterForCall);
}
GetAll
имеет такую сигнатуру:
public static IList<T> GetAll(Expression<Func<T, bool>> predicate = null);
Затем я вызываю метод GetCondition
, который преобразует выражение в SQL:
private static string GetCondition(Expression predicate = null);
Это рекурсивная функция. В нем я попадаю в ситуацию, что мне нужно добраться до параметра, который я передал в выражение GetAll
, с именем parameterForCall
.
Проблема в том, что я могу написать это:
dynamic value = (predicate as ConstantExpression);
А в ImmediateWindow я вижу, что value.Value пишется вот так:
{FMC.Proxy.Common.BaseDAL.}
parameterForCall: 19
Но я не могу получить значение 19. И я хочу, чтобы я мог преобразовать его в значение, чтобы поместить его в строку SQL.
Кто-нибудь знает, как получить значение 19, чтобы я мог использовать его в коде?