【发布时间】:2019-02-13 02:22:46
【问题描述】:
我一直在尝试创建一个表达式,它可以将强类型的 EF Core 实体投影到一个动态对象中,该对象包含一个在运行时使用 REST API 调用定义的列表。
这是我目前所拥有的:
Expression<Func<Message, dynamic>> DynamicFields(IEnumerable<string> fields)
{
var xParameter = Expression.Parameter(typeof(Message), "o");
var xNew = Expression.New(typeof(ExpandoObject));
var bindings = fields.Select(o => {
var mi = typeof(Message).GetProperty(o);
var xOriginal = Expression.Property(xParameter, mi);
return Expression.Bind(mi, xOriginal);
});
var xInit = Expression.MemberInit((dynamic)xNew, bindings);
return Expression.Lambda<Func<Message, dynamic>>(xInit, xParameter);
}
感觉就像我非常接近,但这在运行时会爆炸,说明 X 属性不是 ExpandoObject 的成员。我尝试改变动态和 ExpandoObject 的使用,但似乎没有任何效果 - 这甚至可能吗?
如果我为 Message 切换出 dyanmic / ExpandoObject,它工作得很好,但会返回 Message 类的一个实例,其所有属性都为其默认值。
以前有人做过吗?
干杯。
【问题讨论】:
-
为什么不直接转换为动态,为什么要为此创建表达式?
-
因为直到运行时我才知道选择哪些字段
-
基本上你想动态过滤你的属性数据集
-
你为什么不把所有的结果都拉到一个key to value的字典中,很确定json序列化器会默认创建一个对象
标签: c# linq dynamic entity-framework-core expression-trees