【发布时间】:2019-12-19 06:23:50
【问题描述】:
我有一个如下的 lambda 表达式:
var source = new List<Entidade>();
var z = source.Select<Entidade, Resultado>(
s =>
new Resultado
{
Detalhes =
new List<DetalheResultado>(
s.Detalhes.Select<Detalhe, DetalheResultado>(
t => new DetalheResultado { Id = t.Id, Valor = t.Valor }))
});
我正在尝试使用以下代码使用表达式执行相同的查询:
ParameterExpression sourceItem = Expression.Parameter(typeof(Entidade), "s");
var source3 = Expression.Parameter(typeof(Detalhe), "t");
var property3 = typeof(DetalheResultado).GetProperty("Id");
var member3 = Expression.Property(source3, "Id");
var itemResult3 = Expression.New(typeof(DetalheResultado).GetConstructor(Type.EmptyTypes));
var memberBinding3 = Expression.Bind(property3, member3);
var memberInit3 = Expression.MemberInit(itemResult3, memberBinding3);
var selector3 = Expression.Lambda(memberInit3, source3);
var detalhes = Expression.Property(sourceItem, "Detalhes");
// here you get an error
var lista3 = Expression.Call(
typeof(Queryable),
"Select",
new Type[] { typeof(Detalhe), typeof(DetalheResultado) },
detalhes,
selector3);
var listaResultado = typeof(DetalheResultado).GetProperty("Detalhes");
var memberBindigs4 = Expression.Bind(listaResultado, lista3);
...
但是运行这段代码我得到了错误:
“System.Linq.Queryable”类型上没有通用方法“Select” 与参数和提供的类型参数兼容。任何 如果方法不是通用的,则必须提供参数。
我查阅了 DebugView 表达式并实现了表达式作为它的返回值,但得到了上述错误。
有什么建议吗?
【问题讨论】:
-
您是否也需要使用表达式树来完成
Select调用?制作投影表达式并在常规方法调用中调用Select要容易得多。 -
Queryable.Select 的第一个参数应该是
IQueryable,但似乎s.Detalhes是IEnumerable。你能提供类定义吗? -
@Grundy,你是对的。 s.Detalhes 是 IEnumerable。将 typeof(Queryable) 更改为 typeof(Enumerable) 修复了该错误。
标签: c# linq expression-trees