2014-10-19 90 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; 
    } 
} 

而且當我實際設置查詢時,我有一個所有標準和它們的值的列表,這看起來很好,但是......他們的類型都搞砸了。 的問題是,我的下一個步驟是正確的值的類型轉換爲特定的數據庫格式:

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()? – 2014-10-19 01:12:00

+0

@AnthonyRussell是的,我得到的類型是正確的(例如'Int32'),但由於它是Linq.Expression,因此無法將其轉換。所以我保存了一個變量「{1}」,但它不是一個INT,它就是這個'Linq.Expression'類型,我不能從它轉換出來。 – Danicco 2014-10-19 01:21:46

回答

0

當您創建LINQ查詢來創建數據時,請驗證它是什麼類型的數據。 因此,例如,當你確認類型,可以分析一個字符串轉換成一個DateTime結構是這樣的:Parse string to DateTime in C#

,與你LINQ.Expression類型的最好的事情是這樣的:將其轉換爲字符串。然後將該字符串動態轉換爲您需要的類型。

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

您可以瞭解更多有關表達式在這裏:http://msdn.microsoft.com/fr-fr/library/system.linq.expressions.expression.call(v=vs.110).aspx

所提供的代碼來自這個實際的答案:LINQ Expression Conversion/Concat from Int to string

當你擁有類型爲字符串,創造出讀取字符串的方法和驗證字符串代表什麼類型並解析它。然後,您將該值作爲對象返回。

希望它能幫助你!

如果答案無論如何都會幫助你,請將它作爲答案來檢查,以便有相同問題的其他人知道該怎麼做!

相關問題