我正在使用表达式编写自定义查询构建器,并且在某些时候我将表达式的值保存到我的条件类中:
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 :(得分: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
当您将字符串作为字符串时,请创建一个方法,该方法读取字符串并验证字符串表示的类型并对其进行解析。然后将值作为对象返回。
希望它可以帮助你!
如果答案对你有帮助,请将其作为答案检查,以便其他有相同问题的人知道该怎么做!