【发布时间】: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