2014-10-19 2 views
0

я кодирование пользовательского конструктора запросов из выражений, и в каком-то момент я экономлю значение выражения моих критериев класса:Преобразование значения из выражения другого типа C#

switch(expression.NodeType) 
{ 
    case ExpressionType.Constant: 
    { 
     //Here there should only be raw values 
     CriteriaClass newCriteria = new CriteriaClass(); 
     newCriteria.Value = expression; //Value is of 'object' type 

     return newCriteria; 
    } 
} 

И когда я на самом деле настраиваю запрос, у меня есть список всех критериев и их значений, которые кажутся прекрасными, но ... их типы все испорчены. Проблема заключается в том, что мой следующий шаг преобразования правильно типы значений для конкретного формата DB:

private string FormatWriteValue(object value, Type type) 
{ 
    if (value == null) { return "NULL"; } 

    if (value.GetType().IsEnum) { return ((int)value).ToString(); } 

    switch(type.Name) 
    { 
     case "Boolean": 
     case "bool": 
      return ((bool)value) ? "1" : "0"; 
     case "Int32": 
     case "int": 
      return value.ToString(); 
     case "DateTime": 
      return "CONVERT(DATETIME, '" + ((DateTime)value).ToString("dd/MM/yyyy hh:mm:ss") + "', 103)"; 
     default: 
      return "'" + value.ToString().Replace("'", "''") + "'"; 
    } 
} 

Поскольку тип никогда не один из основных, я напечатанных там, он всегда падает на значения по умолчанию случай для строк. Я попытался заливка значения выражения, как это:

criteria.Value = (int)expression; //exception 
criteria.Value = Convert.ChangeType(expression, expression.Type); //Type = Int32, but exception again 
criteria.Value = Expression.Convert(expression, expression.Type); //Becomes Unary, no exception 

Я думаю, что для последнего, чтобы работать, я должен был бы составить выражение, но я читал, что это дорого, и я бы как бы держать это как можно легче.

Как это сделать?

+0

Не думаю, что я полностью понимаю, что вы просите, но попробовали ли Type.GetType()? –

+0

@AnthonyRussell Да, тип, который я получаю, является правильным (например, 'Int32'), но значение не может быть преобразовано из него, так как это' Linq.Expression'. Поэтому я сохраняю переменную «{1}», но это не INT, это тип 'Linq.Expression', и я не могу преобразовать его. – Danicco

ответ

0

Когда вы создаете свой запрос LINQ для создания своих данных, проверьте, какой тип данных он имеет. Так, например, когда вы делаете подтвердить тип, вы можете разобрать строку в DateTime структуры, как это: Parse string to DateTime in C#

Самое лучшее, что можно сделать с вашим типом LINQ.Expression это: преобразовать его в строку. Затем динамически преобразуйте эту строку в нужный вам тип.

var criteriaToBeConverted = Expression.Call(
        Expression.Convert(memberExpression, typeof(object)), 
        typeof(object).GetMethod("ToString")); 

Вы можете узнать больше о Expression здесь: http://msdn.microsoft.com/fr-fr/library/system.linq.expressions.expression.call(v=vs.110).aspx

Предоставленный код приходит от этого фактического ответа: LINQ Expression Conversion/Concat from Int to string

Если у вас есть тип в виде строки, создать метод, который считывает строку и проверяет, какой тип представляет строка и анализирует ее. Затем вы возвращаете значение как объект.

Надеюсь, это поможет вам!

Если ответ вам поможет в любом случае, проверьте его как ответ, чтобы другие с той же проблемой могли знать, что делать!

Смежные вопросы