LINQ to实体支持匿名类型作为返回类型,例如:
var query = from a in b.C select new { Value = a.Value };
编译器生成的代码将类似于:
private class f__AnonymousType0<j__TPar>
{
private readonly j__TPar i__Field;
public j__TPar Value
{
get { return i__Field; }
}
public f__AnonymousType0(j__TPar Value)
{
i__Field = Value;
}
}
但是,如果我使用生成的匿名类型实例:
var query = from a in b.C select new f__AnonymousType0<string>(a.Value);
错误:
System.NotSupportedException: Only parameterless constructors and initializers are supported in LINQ to Entities.
将被抛出。
那么匿名类型在这里如何工作?
如果编译器必须执行匿名类型初始化器,那么它将最终调用构造函数。但是在LINQ to Entities(或其他任何IQueryable
基于LINQ的提供程序)中,代码实际上并未执行……只是将其转换为表达式树。
所以在您的示例中:
var query = from a in b.C select new { Value = a.Value };
...将转换为Expression.New
有效代表匿名类型初始化程序的调用。至关重要的是(我相信),它将创建一个NewExpression
带有Members
属性集的,以指示该Value
属性是从第一个参数到构造函数的初始化。
我希望LINQ to Entities可以对其进行分析,NewExpression
以找出原始代码的含义,并推断将其转换为SQL所需执行的操作。仅仅通过构造函数调用就无法做到这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句