如何使用LINQ to Entities初始化匿名类型?

跑背者

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

LINQ to Entities不支持指定的类型成员'Date'。仅初始化器,实体成员和实体导航属性

实现IEnumerable'System.Collections.Generic.List`1'的类型无法在LINQ to Entities查询中初始化

该类型出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中

该类型出现在单个 LINQ to Entities 查询中的两个结构不兼容的初始化中

使用LINQ / Delegates,如何初始化属性属于类型列表的Object的所有成员?

使用包括块初始化程序的匿名类初始化静态ArrayList字段

如何从类型初始化 BehaviorSubject?

如何初始化复合类型?

如何初始化类型界面?

如何初始化这些数组类型?

如何正确初始化var类型

如何在Java中初始化匿名内部类

如何使用默认值初始化值类型?

如何使用单个路径初始化 StorageFolder 类型的变量?

使用动态/具体类型初始化类型变量

使用动态协议类型的Swift动态类型初始化

如何在Typescript中初始化类型化数组

从联接映射-类型“ CarDTO”出现在单个LINQ to Entities查询中的两个结构不兼容的初始化中

如何使用通用字段初始化匿名结构数组

重载>>运算符,并使用自定义类型的初始化列表初始化

使用初始化列表进行POD类型初始化不起作用

无法使用集合初始化程序初始化类型

使用“(Class)Object”类型的初始化创建和初始化对象

如何在不使用匿名对象的情况下初始化列表初始值设定项中的对象?

PHP 7.4:如何检查类型属性是否已初始化(包括使用 null 初始化)?

如何修复“对类型的引用需要初始化程序”?

如何解决:从不兼容的指针类型初始化

numba如何推断字面初始化的本地类型?

如何初始化内联结构类型的指针成员?