使用时,IQuerayble<TItem>
我们可以Select
这样调用:
query.Select( item => new { A=item.Prop1, B=item.Prop2});
和Select
方法期望Expression<Func<TItem,TResult>>
我需要使用ExpandoObject
匿名但静态类型的类来代替。
如果可能的话,它看起来像:
query.Select( item => dynamic new ExpandoBoject { A=item.Prop1, B=item.Prop2});
所以我想构建表达式树Expression<Func<TItem,ExpandoObject>>
,其中对象的属性以与匿名类型类似的方式初始化。
动态功能仅在初始化时才需要,因此 Func 返回ExpandoObject
而不是dynamic
.
我找不到太多关于Expression.Dynamic
我应该使用的文档和相应的活页夹。
更新 1
为什么我需要所有这些东西?
因为我想得到主键。
我想为任何实体类型做这件事。
我知道如何获取组成 PK 的属性列表,但现在我需要将实体投影到EntityKey
. 好吧,可能与此类相同。
var keys = context.Set<TEntity>().Where(Expression<Func<TEntity,bool>).Select(Expression<Func<TEntity,EntityKey>>);
正如我在评论中指出的,包含块的 lambdas 不能转换为表达式树,所以我不能简单地创建字典并填充它。现在我正在使用语义上接近此代码的表达式树:
var dict = new Dictionary<string,object>();
dict.Add("Prop1",value1);
dict.Add("Prop2",value2);
return dict
但我怀疑 EF 是否可以解析包含块的表达式。需要检查。
而且我很好奇它是否可以与动态对象和 Expression.MemberInit 一起使用,因为它可以与静态对象一起使用。
更新 2
实体框架不支持字典初始化语法。
它抛出NotSupportedException
消息:LINQ to Entities 中仅支持具有单个元素的列表初始化程序项。
更新 3
EF 也不支持块表达式。
NotSupportedException
带有消息:“块”类型的未知 LINQ 表达式。