将值从表达式转换为另一种类型C#

时间:2014-10-19 00:46:51

标签: c# linq expression

我正在使用表达式编写自定义查询构建器,并且在某些时候我将表达式的值保存到我的条件类中:

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

我认为最后一个工作我必须编译表达式,但我已经读过这个代价很高,而且我希望尽可能保持这一点。

我该如何做到这一点?

1 个答案:

答案 0 :(得分: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

当您将字符串作为字符串时,请创建一个方法,该方法读取字符串并验证字符串表示的类型并对其进行解析。然后将值作为对象返回。

希望它可以帮助你!

如果答案对你有帮助,请将其作为答案检查,以便其他有相同问题的人知道该怎么做!