【问题标题】:Converting a value from an expression to another type C#将值从表达式转换为另一种类型 C#
【发布时间】:2014-10-19 00:46:50
【问题描述】:

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

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

我认为要使最后一个工作正常,我必须编译表达式,但我已经读到它的成本很高,我想尽可能地简化它。

我怎样才能做到这一点?

【问题讨论】:

  • 我不认为我完全理解你在问什么,但你尝试过 Type.GetType() 吗?
  • @AnthonyRussell 是的,我得到的类型是正确的(例如Int32),但是由于它是Linq.Expression,因此无法从中转换值。所以我保存了一个变量“{1}”,但它不是一个 INT,而是这个 Linq.Expression 类型,我无法从中转换出来。

标签: c# linq expression


【解决方案1】:

当您创建 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

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

希望对你有所帮助!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2020-12-14
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多