我正在尝试构建一个反映“选择新”查询的表达式树。
我正在使用Ethan对此question的回答。 它适用于常见列表,但使用LINQ to Entities我得到了这个例外:
System.NotSupportedException: Unable to create a constant value of type X.
Only primitive types or enumeration types are supported in this context.
其中X是我正在查询的实体。
使用调试器,这是具有表达式树的IQueryable:
SELECT [Extent1].[Id] AS [Id],
[Extent1].[Nombre] AS [Nombre],
[Extent1].[Apellido] AS [Apellido]
FROM [dbo].[Empleadoes] AS [Extent1]
.Select(t => new Nombre;String;() {Nombre = t.Nombre})
这是使用普通linq表示法的IQueryable(实际上不是相同的查询,但要明白 - 它们是不同的)
SELECT [Extent1].[Dni] AS [Dni],
[Extent1].[Nombre] + N' ' + [Extent1].[Apellido] AS [C1]
FROM [dbo].[Empleadoes] AS [Extent1]
任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
查看Dynamic LINQ代码,我发现了问题。
Ethan的解决方案是这样做的:
source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable),
"Select",
new Type[] { source.ElementType, dynamicType },
Expression.Constant(source),
selector));
在Dynamic LINQ的Dynamic.cs中,他们这样做:
source.Provider.CreateQuery(
Expression.Call(
typeof(Queryable),
"Select",
new Type[] { source.ElementType, lambda.Body.Type },
source.Expression,
Expression.Quote(lambda)));
相关更改位于Expression.Call调用的第4个参数中。