我正在尝试生成一个动态表达式,可以对ExpandoObjects列表进行排序。我不知道expandoobjects中会包含什么(string,int,decimal,datetime等)。
不幸的是,如果在执行orderby时列表中有空值,则会抛出异常。我可以在使用Where方法排序之前从我的集合中删除空值,但我想在返回的结果中保留空行。
我试图做的是生成If Else语句,例如:
x => x.Item["Key"] != null ? x.Item["Key] : defaultvaluefortype
这是我的代码段:
if (type == typeof (ExpandoObject))
{
arg = Expression.Parameter(typeof (T), "x");
expr = arg; //Get type of T
var first = (IDictionary<string, object>) source.First();
//Match the case of the string to the correct key value.
var propval =
first.Keys.First(x => String.Equals(x, prop, StringComparison.CurrentCultureIgnoreCase));
var key = Expression.Constant(propval, typeof(string));
ParameterExpression dictExpr = Expression.Parameter(typeof(IDictionary<string, object>));
var indexer = dictExpr.Type.GetProperty("Item");
var exprkeyed = Expression.Property(expr, indexer, key);
//Generates x.Item["KeyString"] so I can access the object.
expr = exprkeyed;
var Null = Expression.Constant(null);
expr = Expression.NotEqual(expr, Null);
expr = Expression.Condition(expr, exprkeyed, Expression.Constant(false)); //what do I return as the else?
type = typeof(Object);
}
不幸的是,如果我尝试根据键类型设置默认值,我会得到一个异常,即我的if / else的返回值不匹配(即;一个是system.object,一个是system.datetime) 。我相信object的默认值也是null,所以这不是最好的。
有没有办法在不使用where语句首先删除空条目的情况下执行此操作?也许我可以在其他地方返回,就像跳过或排序/高?
感谢您的时间。
答案 0 :(得分:2)
您将返回Expression.Default(typeof(T))
。
在您的代码中更改
expr = Expression.Condition(expr, exprkeyed, Expression.Default(typeof(T)));